@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" для каждого элемента.
@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, выводим на консоль необходимое свойство для каждого объекта.