Ios 为什么可以';通过调用Swift中的静态函数初始化静态变量?
据我所知,从Xcode 6.3/Swift 1.2开始,我可以在类中使用静态变量和方法。但是,当我试图通过调用静态函数初始化静态变量时,编译器不喜欢它(在下面的示例中,我得到了错误“Use of unresolved identifier getDefaultString”)。下面是一个演示我的问题的片段:Ios 为什么可以';通过调用Swift中的静态函数初始化静态变量?,ios,swift,Ios,Swift,据我所知,从Xcode 6.3/Swift 1.2开始,我可以在类中使用静态变量和方法。但是,当我试图通过调用静态函数初始化静态变量时,编译器不喜欢它(在下面的示例中,我得到了错误“Use of unresolved identifier getDefaultString”)。下面是一个演示我的问题的片段: import Foundation public class Settings { private static var _bundle = NSBundle.mainBundle
import Foundation
public class Settings {
private static var _bundle = NSBundle.mainBundle()
static func getDefaultString(key: String) -> String {
return _bundle.objectForInfoDictionaryKey(key) as! String
}
private static var _server = getDefaultString("DefaultServer")
public class var server: String {
get { return _server }
set { _server = newValue }
}
}
有人能帮我理解为什么我不能这样做吗?这应该可以:
private static var _server = Settings.getDefaultString("DefaultServer")
我不知道确切的原因,似乎有一种假设,即前面没有类型限定的方法是实例方法。但这并不完全有效。例如,这在操场上产生了有趣的结果:
class Foo {
static func initFoo() -> String {
return "static"
}
func initFoo() -> String {
return "instance"
}
static var foo: String = initFoo()
}
Foo.foo
import Foundation
class Settings {
private static var _bundle = NSBundle.mainBundle()
static func getDefaultString(key: String) -> String? {
return _bundle.objectForInfoDictionaryKey(key) as? String
}
private static var _server = Settings.getDefaultString("DefaultServer")
class var server: String? {
get { return _server }
set { _server = newValue }
}
}
Settings.server
。。。不需要在initFoo()前面限定类型,但仍然会选择静态类型。可能是一个小错误。您正在强制展开一个可能的(和实际的)
nil
对象
return _bundle.objectForInfoDictionaryKey(key) as! String
NSBundle
的objectForInfoDictionaryKey
可以返回nil——
其宣言:
func objectForInfoDictionaryKey(key: String) -> AnyObject?
我的编辑,作为一个游乐场:
class Foo {
static func initFoo() -> String {
return "static"
}
func initFoo() -> String {
return "instance"
}
static var foo: String = initFoo()
}
Foo.foo
import Foundation
class Settings {
private static var _bundle = NSBundle.mainBundle()
static func getDefaultString(key: String) -> String? {
return _bundle.objectForInfoDictionaryKey(key) as? String
}
private static var _server = Settings.getDefaultString("DefaultServer")
class var server: String? {
get { return _server }
set { _server = newValue }
}
}
Settings.server
当然,如果您愿意,您可以用其他方式从
nil
中回退。如果您使用private static var\u server=Settings.getDefaultString(“DefaultServer”)
,它会起作用吗?事实上,它会起作用。但我不明白为什么?