以下代码在 Swift 4.2 (Xcode 10) 中的行为不再与在 Swift 4.1 (Xcode 9.4.1) 中的行为相同:
let key: String! = "key"
let dict: [AnyHashable:Any]? = ["key":"value"]
let val = dict?[key]
在 Swift 4.1 中,val
接收字典值(“value”),而在 Swift 4.2 中它是 nil。
如果我删除隐式展开的可选(IUO)或将字典声明为,问题就会消失[String:Any]
,所以两者
let key: String = "key"
let dict: [AnyHashable:Any]? = ["key":"value"]
let val = dict?[key]
, 和
let key: String! = "key"
let dict: [String:Any]? = ["key":"value"]
let val = dict?[key]
导致val
最终持有字符串“value”。
这是 Swift 4.2 中的预期行为,还是编译器错误?
问我有一个庞大的代码库,其中键和字典都来自Objective-C代码,这有点难以改变。所以我想知道这种行为变化是否是永久性的,我应该开始更新代码中使用这种模式的许多地方,或者等到 Xcode 10 的稳定版本发布。