Ios 为什么可以';通过调用Swift中的静态函数初始化静态变量?

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

据我所知,从Xcode 6.3/Swift 1.2开始,我可以在类中使用静态变量和方法。但是,当我试图通过调用静态函数初始化静态变量时,编译器不喜欢它(在下面的示例中,我得到了错误“Use of unresolved identifier 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 }
    }
}
有人能帮我理解为什么我不能这样做吗?

这应该可以:

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”)
,它会起作用吗?事实上,它会起作用。但我不明白为什么?