输入任何?没有下标成员 [英] type any? has no subscript members

查看:202
本文介绍了输入任何?没有下标成员的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从个人资料字典获取地址,但是我收到错误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!

这篇关于输入任何?没有下标成员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆