我在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
,我也可以向下转换它。我不明白为什么编译器抱怨这个。
答案 0 :(得分:12)
Xcode通常会警告推断的变量为AnyObject
或
AnyObject?
。您可以添加类型注释(如Xcode所示)以使警告静音:
if let info : AnyObject = ...
我只能推测为什么 Xcode的行为如此,但有一个原因可以
是你被迫"强迫"要注意info
可能是任何对象类型
而不是你期望的那个。
即使info.integerValue
编译,
如果对象不在,它可能会在运行时崩溃
预期的类型。在您的情况下,如果字典值不是NSNumber
或NSString
然后info.integerValue
抛出异常。
安全的方法是选择演员:
if let info = NSBundle.mainBundle().objectForInfoDictionaryKey("v") as? NSNumber {
value = info.integerValue
} else {
value = 0
}
对于NSNumber
和Int
之间的自动重新映射,您也可以将其写为
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