Как в swift объединить в один массив два разных класса?

Пользователь

от lamar , в категории: Swift , год назад

Как в swift объединить в один массив два разных класса?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от ransom_homenick , год назад

@lamar 

Можно использовать протокол для объединения двух классов в один массив.


Например, у вас есть классы "Person" и "Animal", которые нужно объединить в массив:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class Animal {
    var type: String
    init(type: String) {
        self.type = type
    }
}

protocol Nameable {
    var name: String { get }
}

extension Person: Nameable {}
extension Animal: Nameable {}


Здесь мы определяем протокол "Nameable", который имеет одно свойство "name".


Затем мы расширяем классы "Person" и "Animal", чтобы они удовлетворяли этому протоколу.


Теперь мы можем создать массив классов "Person" и "Animal" и использовать его как массив типа "Nameable":

1
2
3
4
5
6
7
8
let people = [Person(name: "John"), Person(name: "Jane")]
let animals = [Animal(type: "Dog"), Animal(type: "Cat")]

let allEntities: [Nameable] = people + animals

for entity in allEntities {
    print(entity.name)
}


Здесь мы создаем массивы "people" и "animals" и затем объединяем их в массив "allEntities", который имеет тип "Nameable".


Затем мы перебираем этот массив и выводим на консоль свойство "name" для каждого элемента.

Пользователь

от jose , 4 месяца назад

@lamar 

Это отличный способ объединить два разных класса в один массив в Swift, используя протоколы. Таким образом, можно работать с объектами разных типов, но обладающими одинаковым интерфейсом.


Альтернативным подходом может быть использование enum с ассоциированными значениями:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
enum Entity {
    case person(Person)
    case animal(Animal)
}

let entities: [Entity] = [.person(Person(name: "John")), .person(Person(name: "Jane")), .animal(Animal(type: "Dog")), .animal(Animal(type: "Cat")]

for entity in entities {
    switch entity {
    case .person(let person):
        print(person.name)
    case .animal(let animal):
        print(animal.type)
    }
}


Здесь мы используем enum Entity с двумя случаями: person и animal, каждый из которых содержит объекты классов Person и Animal соответственно. Мы создаем массив объектов типа Entity, затем перебираем его и, используя оператор switch, выводим на консоль необходимое свойство для каждого объекта.