读取info.plist:推断出类型AnyObject可能是意外的

时间:2015-01-04 16:16:29

标签: ios swift casting info.plist

我在integer文件中插入info.plist,显然,我想从我的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会返回AnyObject?个可选项,我也可以这样做。但是编译器告诉我

  

常数"信息"推断出类型AnyObject可能是   意想不到

如何解决此警告?为什么我要担心该函数返回AnyObject这一事实? < - 这是一个问号... lol

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

1 个答案:

答案 0 :(得分:12)

Xcode通常会警告推断的变量AnyObjectAnyObject?。您可以添加类型注释(如Xcode所示)以使警告静音:

if let info : AnyObject = ...

我只能推测为什么 Xcode的行为如此,但有一个原因可以 是你被迫"强迫"要注意info可能是任何对象类型 而不是你期望的那个。

即使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