【发布时间】:2015-02-17 08:07:07
【问题描述】:
是否有可能在一个数组中包含两个不同的自定义对象?
我想在UITableView 中显示两个不同的对象,我认为最简单的方法是将所有对象放在一个数组中。
【问题讨论】:
-
由于您将同时操作这两种类型的对象,最佳做法是创建一个所有类都实现的
protocol,MVVM 样式。
是否有可能在一个数组中包含两个不同的自定义对象?
我想在UITableView 中显示两个不同的对象,我认为最简单的方法是将所有对象放在一个数组中。
【问题讨论】:
protocol,MVVM 样式。
根据您希望对数组进行多少控制,您可以创建两种对象类型都实现的协议。该协议不需要包含任何内容(在 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)
【讨论】:
如果您事先知道要存储的内容的类型,则可以将它们包装在枚举中。与使用 [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)")
}
}
打印:
Integer: 10
String: Hello
Integer: 42
【讨论】:
您可以使用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]
【讨论】:
您可以使用“类型”AnyObject,它允许您将不同类型的对象存储在数组中。如果你还想使用结构,请使用Any:
let array: [Any] = [1, "Hi"]
【讨论】: