swift 存放多类型的容器

常见问题

在 swift 中容器都是泛型,一个容器只能存放同一类型的元素

public struct Array<Element> : RandomAccessCollection, MutableCollection
public struct Dictionary<Key, Value> : Collection, ExpressibleByDictionaryLiteral where Key : Hashable
public struct Set<Element> : SetAlgebra, Hashable, Collection, ExpressibleByArrayLiteral where Element : Hashable
复制代码

但如果想要把不同的类型放在同一个容器中我们可以使用 Any。

let arry: Array<Any> = ["hello", 99, ["key":"value"]]
复制代码

这样将数组类型定义成 Any 之后我们可以将任意类型添加进数组,也可以从数组中取出的值转换成任意类型。但这样做是十分危险的,取值时一旦类型转换错误再调用该类型的方法后就容易造成不必要的 crash 。

如何处理

如果确实存在这种多类型数据放在同一个数组中的需求时,建议使用带有值的 enum 来处理。

enum TypeOfMyArr {
   case stringValue(String)
   case intValue(Int)
   case dicValue(Dictionary<String, String>)
}
复制代码
    let array: Array<TypeOfMyArr> = [TypeOfMyArr.stringValue("hello"), TypeOfMyArr.intValue(99), TypeOfMyArr.dicValue(["key":"value"])]
    
    for item in array {
        switch item {
        case let .stringValue(s):
            print(s + "world")
        case let .intValue(i):
            print(i + 1)
        case let .dicValue(dic):
            print(dic)
        }
    }
复制代码

这样就可以愉快的在数组中使用不同的数据类型了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值