web-dev-qa-db-ja.com

何か入力しますか?添字のメンバーがありません

プロファイルディクショナリからアドレスを取得したいのですが、「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

修正して住所を取得するにはどうすればよいですか?どうもありがとう。

14
KKG

"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!
23
Alexander

以前に提案したように設計を再考する場合、私は同意します。議論のために、あなたはあなたが探しているものを達成するために以下を実行できます。

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])")
    }
0
Reginaldo Costa