输入任何?没有下标成员

KKG*_*KKG 14 arrays dictionary any swift anyobject

我想从个人资料字典中获取地址,但我收到错误"输入任何内容?没有下标成员"

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
Run Code Online (Sandbox Code Playgroud)

我该如何解决并获取地址?非常感谢.

Ale*_*ica 23

当您下载配置文件时"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])
}
Run Code Online (Sandbox Code Playgroud)

这非常笨重,而且首先使用字典并不是一个非常合适的案例.

在这种情况下,如果你有一组带有固定键的字典,那么结构就是更合适的选择.它们是强类型的,因此您不必进行上下演练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!
Run Code Online (Sandbox Code Playgroud)