读取 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 通常会警告 推断 为 AnyObject
或
AnyObject?
。您可以添加类型注释(如 Xcode 建议的那样)来消除警告:
if let info : AnyObject = ...
我只能推测 为什么 Xcode 会这样,但有一个原因可能
你是 "forced" 要知道 info
可能是 any 对象类型
可能不是您期望的那个。
所以即使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
我在我的 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 通常会警告 推断 为 AnyObject
或
AnyObject?
。您可以添加类型注释(如 Xcode 建议的那样)来消除警告:
if let info : AnyObject = ...
我只能推测 为什么 Xcode 会这样,但有一个原因可能
你是 "forced" 要知道 info
可能是 any 对象类型
可能不是您期望的那个。
所以即使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