2014-12-18 2 views
4

Есть ли возможность иметь два разных пользовательских объекта в одном массиве?Swift: разные объекты в одном массиве?

Я хочу показать два разных объекта в UITableView, и я думаю, что самый простой способ сделать это - иметь все объекты в одном массиве.

+2

Как вы будете манипулировать обоими типами объектов, лучше всего создать «протокол», который реализует все классы, стиль MVVM. – Francescu

ответ

7

В зависимости от того, сколько контроля Вы хотите по массиву, вы можете создать протокол, что оба типа объекта реализации. Протокол не должен иметь ничего в нем (будет интерфейсом маркера в 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) 
+0

На самом деле, в протоколе я бы поставил все функции, которые я собираюсь использовать при использовании этих объектов. Таким образом, вам не нужно подвергать объект другому типу, чтобы использовать его, и вы можете быть уверены, что объекты поддерживают все необходимые функции. – JeremyP

+0

Я не соглашусь с этим, но если между ними нет сходства, кроме необходимости хранить их в массиве для представления таблицы, этот метод работает. Не зная больше о конкретных объектах, трудно сказать, что должно быть в протоколе. Они могут уже реализовать определенный протокол, а затем решение может упростить использование этого протокола в качестве типа массива. –

+0

Спасибо, это именно то, что я искал, потому что с anyobject у меня меньше возможностей. – fahu

2

Вы можете использовать «тип» AnyObject, который позволяет хранить объекты различного типа в массиве. Если вы хотите использовать структуры, использовать Any:

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

Вы можете использовать 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

Если вы знаете типы, что вы будете заранее запомните, вы можете обернуть их в перечисление. Это дает вам больший контроль над типами, чем при использовании [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