【问题标题】:Swift: different objects in one array?Swift:一个数组中的不同对象?
【发布时间】:2015-02-17 08:07:07
【问题描述】:

是否有可能在一个数组中包含两个不同的自定义对象?

我想在UITableView 中显示两个不同的对象,我认为最简单的方法是将所有对象放在一个数组中。

【问题讨论】:

  • 由于您将同时操作这两种类型的对象,最佳做法是创建一个所有类都实现的protocol,MVVM 样式。

标签: ios arrays xcode swift


【解决方案1】:

根据您希望对数组进行多少控制,您可以创建两种对象类型都实现的协议。该协议不需要包含任何内容(在 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)

【讨论】:

  • 实际上,在协议中,我会将要调用的所有函数放入使用这些对象的过程中。这样您就不必将对象转换为另一种类型来使用它们,并且可以确保对象支持您需要的所有功能。
  • 我不会不同意这一点,但是如果它们之间没有相似之处,除了想将它们存储在表格视图的数组中,那么这种方法就可以工作。如果不了解更多关于特定对象的信息,很难说协议中应该包含什么。他们可能已经实现了一些特定的协议,然后解决方案可能会简化为使用该协议作为数组的类型。
  • 谢谢,这正是我一直在寻找的,因为对于任何对象,我都必须减少可能性。
【解决方案2】:

如果您事先知道要存储的内容的类型,则可以将它们包装在枚举中。与使用 [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

【讨论】:

  • 我发现这很有用,因为我确实喜欢我可以使用 switch 语句来确保我处理数组中的任何数据。
【解决方案3】:

您可以使用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]

【讨论】:

    【解决方案4】:

    您可以使用“类型”AnyObject,它允许您将不同类型的对象存储在数组中。如果你还想使用结构,请使用Any

    let array: [Any] = [1, "Hi"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      相关资源
      最近更新 更多