小智 9
根据您对阵列的控制程度,您可以创建两种对象类型实现的协议.该协议不需要包含任何内容(在Java中是标记接口,不确定Swift中是否有特定名称).这将允许您将数组限制为只有您想要的对象类型.请参阅下面的示例代码.
protocol MyType {
}
class A: MyType {
}
class B: MyType {
}
var array = [MyType]()
let a = A()
let b = B()
array.append(a)
array.append(b)
Run Code Online (Sandbox Code Playgroud)
您可以使用AnyObject数组来保存同一数组中的任何类型的对象:
var objectsArray = [AnyObject]()
objectsArray.append("Foo")
objectsArray.append(2)
// And also the inmutable version
let objectsArray: [AnyObject] = ["Foo", 2]
// This way you can let the compiler infer the type
let objectsArray = ["Foo", 2]
Run Code Online (Sandbox Code Playgroud)
如果您事先知道要存储的类型,可以将它们包装在枚举中.这使您可以更好地控制类型而不是使用[Any/AnyObject]:
enum Container {
case IntegerValue(Int)
case StringValue(String)
}
var arr: [Container] = [
.IntegerValue(10),
.StringValue("Hello"),
.IntegerValue(42)
]
for item in arr {
switch item {
case .IntegerValue(let val):
println("Integer: \(val)")
case .StringValue(let val):
println("String: \(val)")
}
}
Run Code Online (Sandbox Code Playgroud)
打印:
Integer: 10
String: Hello
Integer: 42
Run Code Online (Sandbox Code Playgroud)