问题描述
我想从个人资料字典获取地址,但是我收到错误type any?no subscript members
I want to get Addresses from profile dictionary,but I got the error "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
如何修复它并获取地址?非常感谢。
How can I fix it and get the address? Thanks a lot.
推荐答案
当您使用地址下标配置文件
你得到一个任何
实例。您选择使用任何
可以修复同一个数组中的各种类型,导致类型擦除发生。您将需要将结果转换为其真实类型, [[String:Any]]
,以便它知道 Any
instance表示 Array
。那么你可以下标它:
When you subscript profile with "Addresses"
, you're getting an Any
instance back. Your choice to use Any
to fix various types within the same array has caused type erasure to occur. You'll need to cast the result back to its real type, [[String: Any]]
so that it knows that the Any
instance represents an Array
. Then you'll be able to subscript it:
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])
}
这是非常笨重的,首先使用字典不是一个非常合适的情况。
This is very clunky though, and it's not a very appropriate case to be using Dictionaries in the first place.
在这种情况下,你有字典使用一组固定的键,结构是更合适的选择。它们是强类型的,所以您不需要从任何
上下移动,他们具有更好的性能,而且它们更容易使用。尝试这样:
In such a situation, where you have dictionaries with a fixed set of keys, structs are a more more appropriate choice. They're strongly typed, so you don't have to do casting up and down from Any
, they have better performance, and they're much easier to work with. Try this:
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!
这篇关于输入任何?没有下标成员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!