1

当初、私はSwift 2.1でこのコードを持っていました

func onSuccess(jsonData: AnyObject?){
    print(jsonData["message"]) 
}

Swift 2.2 にアップグレードした後、次のようなエラーが発生しました

「添え字」へのあいまいな参照

ラインのためにprint(jsonData["message"])

コードをこれに変更しました

func onSuccess(jsonData: AnyObject?) {

        let json = (jsonData as? [String:AnyObject?]) ?? ["":""]
        print(json)
}

ただし、このステートメントは常に失敗します。AnyObject? [String:AnyObject?] への型キャストは行われず、合体値は nil になります。AnyObject?from からto にキャストしたいと思い[String:AnyObject]ます。出来ますか?

4

2 に答える 2

3

次のように、オプションのバインディングを簡単に使用できます。

func onSuccess(jsonData: AnyObject?) {
    if let json = jsonData as? [String:AnyObject] {
        print(json["message"])
    }
}

[String:AnyObject?]とにかく、Swift 辞書は常に Optional を返すため、辞書の値を Optional として宣言する正当な理由はありません。

この例は、辞書をデコードするためのものでした。

jsonData が辞書ではなく、たとえば辞書の配列である場合は、型を調整するだけです。

func onSuccess(jsonData: AnyObject?) {
    if let json = jsonData as? [[String:AnyObject]] {
        for object in json {
            print(object["message"])
        }
    }
}

等。

于 2016-04-04T09:16:26.287 に答える
1

Swift 2.2では、["key"] の代わりに使用する必要がありAmbiguous reference to 'subscript'ます。あなたの場合、最初の質問は次のようにコードを書く必要があります。jsonData["message"]objectForKeyjsonData.objectForKey("message")

2 番目の質問の答えはAre you sure your JSON Data is a dictionary ですか? あなたのデータは辞書の配列だと思います。私が正しければ。このような辞書の配列に jsonData をキャストする必要があります。

if let json = jsonData as? [[String:AnyObject?]] {
    for data in jsonData { // Enumerate the array of dicts to get value.
        print(data.objectForKey("message"))
    }
}
于 2016-04-04T09:21:24.057 に答える