Когда вы подписываете профиль с "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!
Попробуйте переписать код без использования какого-либо типа. –
. Полагаю, что лучше использовать классы или структуры для адреса и профиля. –
Пожалуйста, не используйте словари, подобные этому. – Alexander