2016-03-28 4 views
1

Pre Swift 2.2、次のコード例は正常にコンパイルされました。 2.2で、それはコンパイラエラーを与える:私はすでにif let経由で辞書値にアンラップしたらスウィフト2.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... 
     } 
    } 
} 

は、なぜ私はこのエラーを取得していますか? Xcodeの7.3

+0

「notifDict」とは何ですか? – dan

+0

@dan - 更新された質問 – hgwhittle

答えて

1

アンラップを用い

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

コンパイラエラー「ダウンストリーム 'から文字列?!」 'String'はオプションをアンラップするだけです。 '!!'を使用することを意味しましたか? " – hgwhittle

+0

@hgwhittle notifDictは何と宣言されていますか? – JAL

+0

質問を更新中... – hgwhittle

1

あなたはnotifDictを定義した方法を私たちにあなたを示したが、値がキー"sender_phone"のために存在する場合、最初のif let句は単にをチェックすることに注意していません。そのような値が存在し、値そのものがの場合はは解凍されません。は、オプションフォームで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 answerを参照してください)。

0

Xcode 7.3以降、同じ問題が発生しています。私は変数にuserInfo(あなたのためnotifDict)の種類を検査するとき、私の場合、私はそれがあることがわかり、を見る:代わりに、予想されるタイプ[String: String?]AnyObject!ある

enter image description here

。私が何をしたか

は、最初にそれを使用する前に、dicitonaryをアンラップです:

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

それは、迅速2.2は、typeプロパティhttps://bugs.swift.org/browse/SR-1024を推測することはできません。このバグに関連して、私は、彼らが行動を変えるかもしれないと思うことがあります後でもう一度。

関連する問題