swift2 Swift 2.2编译器强制将字典值展开两次

vwkv1x7d  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(215)

在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

aiazj4mn

aiazj4mn1#

您还没有向我们展示您是如何定义notifDict的,但是请注意,第一个if let子句只是检查 * 是否存在键"sender_phone"的值 *。如果存在这样的值,并且 * 如果该值本身是可选的 *,则它 * 不会被解包 *,只是以可选形式绑定到predicate

var notifDict : [String: String?] = [:]
notifDict["sender_phone"] = "xxx-xxxxxx"

if let predicate = notifDict["sender_phone"] {
    // predicate is String? here, and needs unwrapping below
    let a = NSPredicate(format: "phoneNumber == %@", predicate ?? "default")
}

这个答案假设notifDict的类型是[String: String?],如果不是(比如[String: AnyObject]的类型,请参见@JAL:s的答案)。

kx7yvsdv

kx7yvsdv2#

将字典中的值展开为String

if let phone = notifDict["sender_phone"] as? String {
    let predicate = NSPredicate(format: "phoneNumber == %@", phone)
    // ...
}

这是假设notifDict的类型为[String : AnyObject]
根据更新的信息更新答案:

let launchOptions: [NSObject: AnyObject]? = [UIApplicationLaunchOptionsRemoteNotificationKey: ["sender_phone" : "test"]]
if let options = launchOptions {
    if let notifDict = options[UIApplicationLaunchOptionsRemoteNotificationKey] {
        if let phone = notifDict["sender_phone"] as? String {
            let predicate = NSPredicate(format: "phoneNumber == %@", phone)
            // ...
        }
    }
}
js4nwp54

js4nwp543#

从Xcode 7.3开始,我就遇到了同样的问题。在我的例子中,当我在Variables View中检查userInfo(您是notifDict)的类型时,我注意到它是:

其为AnyObject!而不是预期的类型[String: String?]
我所做的是在使用词典之前先打开它:

guard let myUserInfo = userInfo as? [String:String] else {
    return
}

这可能与swift 2.2无法推断类型属性https://bugs.swift.org/browse/SR-1024的错误有关,我猜他们可能会在以后再次改变行为。

相关问题