为什么我不能通过在Swift中调用静态函数来初始化静态变量?

时间:2015-06-15 20:38:34

标签: ios swift

据我所知,从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 }
    }
}

有人可以帮助我理解为什么我不能这样做吗?

2 个答案:

答案 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 回退。