据我所知,从Xcode 6.3 / Swift 1.2开始,我可以在类中使用静态变量和方法。但是,当我尝试通过调用静态函数来初始化静态变量时,编译器并不喜欢它(我得到错误'使用未解析的标识符getDefaultString'在下面的示例中)。这是一个演示我的问题的片段:
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 }
}
}
有人可以帮助我理解为什么我不能这样做吗?
答案 0 :(得分:12)
这应该有效:
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
...不需要在initFoo()前面限定类型,但仍然会选择静态类型。可能是一个小错误。
答案 1 :(得分:0)
您正在强制解开可能的(和实际的)nil
对象。
return _bundle.objectForInfoDictionaryKey(key) as! String
NSBundle
的{{1}}可以返回零 -
它的声明:
objectForInfoDictionaryKey
我的编辑,作为一个游乐场:
func objectForInfoDictionaryKey(key: String) -> AnyObject?
如果您愿意,当然可以以其他方式从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
回退。