-2

Swift のキャストに関する問題に直面しています

ここにコード:

 init(response: NSHTTPURLResponse, representation: AnyObject)
{
    super.init(entity:NSEntityDescription.entityForName("File", inManagedObjectContext: NSManagedObjectContext.currentContext())!, insertIntoManagedObjectContext:NSManagedObjectContext.currentContext());

    var result : [String:AnyObject] = representation as! [String : AnyObject];
    if representation["result"] != nil {
        print("result = \(representation["result"])")
        result = representation["result"] as! [String : AnyObject]
    }
}

場合によっては、representation["result"] が nil に等しいと予想されます。その場合、representation["result"] を出力すると、デバッガーは nil を返しますが、それでも条件を渡し、ログに "result = nil" を表示します。次の行を実行すると、致命的なエラーが発生します。オプションの値をアンラップ中に予期せず nil が見つかりました。これは、nil 値をアンラップしようとするため正常です。

しかし、私がそうするなら、私はそれを見つけました:

var result : [String:AnyObject] = representation as! [String : AnyObject];
if result["result"] != nil {
    print("result = \(result["result"])")
    result = representation["result"] as! [String : AnyObject]
}

それはかなりうまくいきます

私は知っています、あなたの何人かが言うことを知っています:あなたはなぜstackoverflowに投稿する解決策を見つけました-私は最初の解決策が機能しない理由を理解したいので、そして私のエラーは確かにこのコンテキストに固有のものではないからです。

4

2 に答える 2

1

representation["result"]結果が次のようになるため、コードはコンパイルされません

エラー: 'subscript' の使用があいまいです

それとは別に、if let代わりに使用することを検討してください:

if let res = result["result"] {
    print("result = \(res)")
    result = res as! [String : AnyObject]
}

guardさらに、 sを使用してキャストをより安全にする必要があります。

guard let result = representation as? [String : AnyObject] else {
    // not a suitable dictionary
    return
}
if let res = result["result"] {
    guard let resultDic = res as? [String : AnyObject] else {
        // not a suitable dictionary neither
        return
    }
    print(resultDic)
}
于 2016-01-20T15:05:34.657 に答える
0

representation["result"]チェックする前に辞書にキャストする必要があるため、入力representation["result"] as! [String : AnyObject]すると正しく機能するはずです。

于 2016-01-20T15:06:42.077 に答える