19

プロファイル ディクショナリからアドレスを取得したいのですが、「type any? has no subscript members」というエラーが表示されました。

var address:[[String : Any]] = [["Address": "someLocation", "City": "ABC","Zip" : 123],["Address": "someLocation", "City": "DEF","Zip" : 456]]
var profile:[String : Any] = ["Name": "Mir", "Age": 10, "Addresses": address]
profile["Addresses"][0]     <-----------------type any? has no subscript members

どうすればそれを修正してアドレスを取得できますか? どうもありがとう。

4

3 に答える 3

4

andを構築するためにどのように選択したかを再考する必要がadressありprofileます。たとえば、Alexander Momchliov の回答を参照してください。


技術的な議論のために、配列にラップされた辞書が含まれていることがわかっているのメンバーを抽出できます。から への順次型変換の試みと、それに続く要素ごとの (試行された) への変換:Anyprofile[String: Any]Anyprofile["Addresses"][Any][String: Any]

if let adressDictsWrapped = profile["Addresses"] as? [Any] {
    let adressDicts = adressDictsWrapped.flatMap{ $0 as? [String: Any] }
    print(adressDicts[0]) // ["Zip": 123, "City": "ABC", "Address": "someLocation"]
    print(adressDicts[1]) // ["Zip": 456, "City": "DEF", "Address": "someLocation"]
}

または、中間ステップなしで...

if let adressDicts = profile["Addresses"] as? [[String: Any]] {
   print(adressDicts[0]) // ["Zip": 123, "City": "ABC", "Address": "someLocation"]
   print(adressDicts[1]) // ["Zip": 456, "City": "DEF", "Address": "someLocation"]
}

しかし、これは型付き変換の試行に関する小さな教訓にすぎません (-> しないでください)。

于 2016-08-15T14:51:32.153 に答える
0

以前に提案されたように設計を再考する場合は同意します。議論のために、次のことを実行して、求めているものを達成できます。

var address:[[String : Any]] = [["Address": "someLocation", "City": "ABC","Zip" : 123],["Address": "someLocation", "City": "DEF","Zip" : 456]]
var profile:[String : Any] = ["Name": "Mir", "Age": 10, "Addresses": address]
if let allAddresses = profile["Addresses"] as? [[String:Any]] {
    print("This are all the address \(allAddresses[0])")
    }
于 2016-08-15T15:19:23.850 に答える