2016-03-28 18 views
1

Pre Swift 2.2, aşağıdaki kod örneği başarıyla derlendi. Zaten if let aracılığıyla sözlük değerine açılmamış ettik zamanSwift 2.2 derleyici zorlanıyor Sözlük değeri iki kez açılacak

// 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... 
     } 
    } 
} 

Neden şu hatayı alıyorum: 2.2 sayesinde derleyici hata veriyor? Xcode 7.3

+0

'notifDict' nedir? – dan

+0

@dan - updated soru – hgwhittle

cevap

1

sarılı String olarak sözlükten değerini kullanarak

NOT:

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

Bu notifDict varsayarak tiptendir [String : AnyObject] taşımaktadır.

güncellenmiş bilgilere dayanarak

Güncelleme cevap:

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) 
      // ... 
     } 
    } 
} 
+0

Derleyici hatası "Downcast from 'String ?!' 'String' için sadece isteğe bağlı istemciler. '!!' ifadesini kullanmak mı istediniz? – hgwhittle

+0

@hgwhittle 'notifDict' olarak ne bildirildi? – JAL

+0

Soruların güncellenmesi ... Xcode 7.3'de – hgwhittle

1

Sen notifDict tanımlanmış, ancak bir değer "sender_phone" anahtar için varsa ilk if let fıkra basitçe alacağına dikkat ettik nasıl bize gösterdiğim değil. Böyle bir değer varsa ve değeri kendiliğinden isteğe bağlı bir ise, , isteğe bağlı formda predicate'a bağlanamaz. Bu cevap notifDict üstleniyor

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") 
} 

tip [String: String?] taşımaktadır. Değilse ([String: AnyObject] türünde, bkz. @JAL:s answer).

0

Xcode 7.3'ten beri aynı sorunu yaşıyorum. Ben Değişkenleri'nde userInfo (sizin için notifDict) türünü incelemek benim durumumda, o olduğunu fark, görüntüle: yerine beklenen türde [String: String?] arasında AnyObject! olan

enter image description here

. Yaptıklarımı

ilk kullanmadan önce dicitonary paketini geçerli:

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

Bu hızlı 2.2 tipi özelliğini https://bugs.swift.org/browse/SR-1024 tahmin edemeyeceğimiz bu hatadan ilgili ve onlar davranışlarını değişebilir tahmin edilebilir sonra tekrar.