常见问题
在 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)
}
}
这样就可以愉快的在数组中使用不同的数据类型了。
网友评论