当您使用 下标配置文件时"Addresses"
,您将获得一个Any
实例。您选择使用Any
以适应同一数组中的各种类型已导致发生类型擦除。您需要将结果转换回其真实类型,[[String: Any]]
以便它知道该Any
实例表示一个Array
. 然后你就可以给它下标:
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!