У меня есть гетерогенная коллекция разных типов, которые все соответствуют одному и тому же протоколу.Я хочу отсортировать массив по типу, а затем атрибут имени.Например, я хочу, чтобы этот массив животных сортировался по типу в следующем порядке: собака, птица, а затем рыба, а если они одного типа, я хочу отсортировать по имени.Вот код:
import Foundation
protocol Animal {
var name: String { get set }
}
class Dog: Animal {
var name: String
init(name: String) {
self.name = name
}
}
class Bird: Animal {
var name: String
init(name: String) {
self.name = name
}
}
class Fish: Animal {
var name: String
init(name: String) {
self.name = name
}
}
let dogA = Dog(name: "A")
let dogB = Dog(name: "B")
let birdA = Bird(name: "A")
let birdB = Bird(name: "B")
let fishA = Fish(name: "A")
let fishB = Fish(name: "B")
let animals: [Animal] = [fishB, fishA, birdB, birdA, dogB, dogA]
let sortedAnimals = animals.sorted { first, second -> Bool in
if first is Dog && !(second is Dog) {
return true
} else if first is Dog && second is Dog {
return first.name < second.name
}
if first is Bird && !(second is Bird) {
return true
} else if first is Bird && second is Bird {
return first.name < second.name
}
if first is Fish && !(second is Fish) {
return true
} else if first is Fish && second is Fish {
return first.name < second.name
}
return first.name < second.name
}
sortedAnimals
Это работает и приводит к правильному порядку сортировки:
{name "A", type "Dog"}
{name "B", type "Dog"}
{name "A", type "Bird"}
{name "B", type "Bird"}
{name "A", type "Fish"}
{name "B", type "Fish"}
Но так как в рабочем коде у меня более 30 различных типов в коллекции такого родаповторения кажется очень дублирующим.Как я могу сделать такой вид без такого большого количества повторяющегося кода?