读取 info.plist:推断具有 AnyObject 类型,这可能是意外的

Reading info.plist: inferred to have type AnyObject which may be unexpected

我在我的 info.plist 文件中插入了一个 integer,显然,我想从我的 Swift UIViewController 中检索它。代码很简单:

class MyController: UIViewController {

    private let value: Int

    required init(coder aDecoder: NSCoder) {

        if let info = NSBundle.mainBundle().objectForInfoDictionaryKey("v"){
            value = info.integerValue
        }else{
            value = 0
        }

        super.init(coder: aDecoder)
    }

    //other auto-generated-methods
    //...

}

函数 objectForInfoDictionaryKey returns 和 AnyObject? 可选,我同意这个。但是编译器对我说

Constant "info" inferred to have type AnyObject which may be unexpected

我该如何解决这个警告,为什么我要担心函数 returns 是一个 AnyObject? <-- 这是一个问号...大声笑

即使它 returns 一个 AnyObject 如果对象不是 nil 我也可以向下转换它。我不明白为什么编译器会抱怨这个。

Xcode 通常会警告 推断 AnyObjectAnyObject?。您可以添加类型注释(如 Xcode 建议的那样)来消除警告:

if let info : AnyObject = ...

我只能推测 为什么 Xcode 会这样,但有一个原因可能 你是 "forced" 要知道 info 可能是 any 对象类型 可能不是您期望的那个。

所以即使info.integerValue编译, 如果对象不是,它可能会在运行时崩溃 预期的类型。在您的情况下,如果字典值不是 NSNumberNSString 然后 info.integerValue 抛出异常。

安全的方法是进行可选转换:

if let info = NSBundle.mainBundle().objectForInfoDictionaryKey("v") as? NSNumber {
    value = info.integerValue
} else {
    value = 0
}

NSNumberInt之间的自动重新映射你也可以写成

if let info = NSBundle.mainBundle().objectForInfoDictionaryKey("v") as? Int {
    value = info
} else {
    value = 0
}

或者作为单行使用 nil-coalescing 运算符 ??:

let value = NSBundle.mainBundle().objectForInfoDictionaryKey("v") as? Int ?? 0