【问题标题】:Why can't I initialize a static variable by calling a static function in Swift?为什么我不能通过在 Swift 中调用静态函数来初始化静态变量?
【发布时间】:2015-06-15 20:38:33
【问题描述】:

据我了解,从 Xcode 6.3 / Swift 1.2 开始,我可以在类中使用静态变量和方法。但是,当我尝试通过调用静态函数来初始化静态变量时,编译器不喜欢它(在下面的示例中出现错误“使用未解析的标识符 getDefaultString”)。这是一个演示我的问题的 sn-p:

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")是否有效?
  • 事实上,确实如此。但我不明白为什么?

标签: ios swift


【解决方案1】:

您正在强制解开一个可能的(和实际的)nil 对象。

return _bundle.objectForInfoDictionaryKey(key) as! String

NSBundleobjectForInfoDictionaryKey 可以返回 nil – 它的声明:

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

当然,如果您愿意,也可以通过其他方式从 nil 回退。

【讨论】:

    【解决方案2】:

    这应该可行:

    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() 前限定类型,但仍会选择静态类型。可能是一个小错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多