常见问题
在 swift 中容器都是泛型,一个容器只能存放同一类型的元素
public struct Array: RandomAccessCollection, MutableCollectionpublic struct Dictionary : Collection, ExpressibleByDictionaryLiteral where Key : Hashablepublic struct Set : SetAlgebra, Hashable, Collection, ExpressibleByArrayLiteral where Element : Hashable复制代码
但如果想要把不同的类型放在同一个容器中我们可以使用 Any。
let arry: Array= ["hello", 99, ["key":"value"]]复制代码
这样将数组类型定义成 Any 之后我们可以将任意类型添加进数组,也可以从数组中取出的值转换成任意类型。但这样做是十分危险的,取值时一旦类型转换错误再调用该类型的方法后就容易造成不必要的 crash 。
如何处理
如果确实存在这种多类型数据放在同一个数组中的需求时,建议使用带有值的 enum 来处理。
enum TypeOfMyArr { case stringValue(String) case intValue(Int) case dicValue(Dictionary)}复制代码
let array: Array= [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) } }复制代码
这样就可以愉快的在数组中使用不同的数据类型了。