在Swift 2.2之前,以下代码示例成功编译。在Swift 2.2中,它给出了编译器错误:
// launchOptions: [NSObject: AnyObject]?
if let options = launchOptions {
if let notifDict = options[UIApplicationLaunchOptionsRemoteNotificationKey] {
if let phone = notifDict["sender_phone"] {
let predicate = NSPredicate(format: "phoneNumber == %@", phone)
// value of optional type 'String?' not unwrapped; did you mean to use...
}
}
}
当我已经通过if let
展开到Dictionary值时,为什么会出现此错误?
注意使用Xcode 7.3
3条答案
按热度按时间aiazj4mn1#
您还没有向我们展示您是如何定义
notifDict
的,但是请注意,第一个if let
子句只是检查 * 是否存在键"sender_phone"
的值 *。如果存在这样的值,并且 * 如果该值本身是可选的 *,则它 * 不会被解包 *,只是以可选形式绑定到predicate
。这个答案假设
notifDict
的类型是[String: String?]
,如果不是(比如[String: AnyObject]
的类型,请参见@JAL:s的答案)。kx7yvsdv2#
将字典中的值展开为
String
:这是假设
notifDict
的类型为[String : AnyObject]
。根据更新的信息更新答案:
js4nwp543#
从Xcode 7.3开始,我就遇到了同样的问题。在我的例子中,当我在Variables View中检查
userInfo
(您是notifDict
)的类型时,我注意到它是:其为
AnyObject!
而不是预期的类型[String: String?]
。我所做的是在使用词典之前先打开它:
这可能与swift 2.2无法推断类型属性https://bugs.swift.org/browse/SR-1024的错误有关,我猜他们可能会在以后再次改变行为。