Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift: different objects in one array?

Is there a possibility to have two different custom objects in one array?

I want to show two different objects in a UITableView and I think the easiest way of doing this is to have all objects in one array.

like image 542
fahu Avatar asked Dec 18 '14 13:12

fahu


3 Answers

Depending on how much control you want over the array, you can create a protocol that both object types implement. The protocol doesn't need to have anything in it (would be a marker interface in Java, not sure if there is a specific name in Swift). This would allow you to limit the array to only the object types you desire. See the sample code below.

protocol MyType {

}


class A: MyType {

}

class B: MyType {

}

var array = [MyType]()

let a = A()
let b = B()

array.append(a)
array.append(b)
like image 142
George M Avatar answered Oct 20 '22 12:10

George M


If you know the types of what you will store beforehand, you could wrap them in an enumeration. This gives you more control over the types than using [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)")
  }
}

Prints:

Integer: 10
String: Hello
Integer: 42
like image 25
Kolja Avatar answered Oct 20 '22 13:10

Kolja


You can use AnyObject array to hold any kind of objects in the same array:

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]
like image 6
redent84 Avatar answered Oct 20 '22 14:10

redent84