プロファイルディクショナリからアドレスを取得したいのですが、「type any?has no subscript member」というエラーが表示されました
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
修正して住所を取得するにはどうすればよいですか?どうもありがとう。
"Addresses"
を使用してプロファイルに添え字を付けると、Any
インスタンスが返されます。 Any
を使用して同じ配列内のさまざまな型に適合することを選択したため、型が消去されました。 Any
インスタンスがArray
を表していることがわかるように、結果を実際の型[[String: Any]]
にキャストする必要があります。次に、それを下付きにすることができます:
func f() {
let address: [[String : Any]] = [["Address": "someLocation", "City": "ABC","Zip" : 123],["Address": "someLocation", "City": "DEF","Zip" : 456]]
let profile: [String : Any] = ["Name": "Mir", "Age": 10, "Addresses": address]
guard let addresses = profile["Addresses"] as? [[String: Any]] else {
// Either profile["Addresses"] is nil, or it's not a [[String: Any]]
// Handle error here
return
}
print(addresses[0])
}
ただし、これは非常に不格好であり、そもそも辞書を使用するのはあまり適切なケースではありません。
このような状況では、固定されたキーのセットを持つ辞書があるため、構造体がより適切な選択肢です。これらは強く型付けされているため、Any
から上下にキャストする必要はありません。パフォーマンスが向上し、操作がはるかに簡単になります。これを試して:
struct Address {
let address: String
let city: String
let Zip: Int
}
struct Profile {
let name: String
let age: Int
let addresses: [Address]
}
let addresses = [
Address(
address: "someLocation"
city: "ABC"
Zip: 123
),
Address(
address: "someLocation"
city: "DEF"
Zip: 456
),
]
let profile = Profile(name: "Mir", age: 10, addresses: addresses)
print(profile.addresses[0]) //much cleaner/easier!
以前に提案したように設計を再考する場合、私は同意します。議論のために、あなたはあなたが探しているものを達成するために以下を実行できます。
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])")
}