Вопрос проверяет понимание обобщенного программирования (generics) в контексте протоколов Swift.
Associated Type (ассоциированный тип) — это заполнитель для конкретного типа, который протокол не определяет заранее. Тип указывается при принятии протокола классом или структурой. Это позволяет создавать гибкие протоколы, которые могут работать с разными типами данных, не привязываясь к одному.
Ассоциированные типы делают протоколы обобщенными (generic). Они объявляются с помощью ключевого слова associatedtype.
Базовый пример:
// Протокол контейнера, который может хранить элементы неизвестного пока типа.
protocol Container {
// Ассоциированный тип. Реализация протокола сама решит, каким он будет.
associatedtype Item
var count: Int { get }
mutating func append(_ item: Item)
subscript(i: Int) -> Item { get }
}
// Принятие протокола. `Item` становится `Int`.
struct IntStack: Container {
typealias Item = Int // Эта строка необязательна, компилятор выведет тип сам.
var items = [Int]()
var count: Int { return items.count }
mutating func append(_ item: Int) {
items.append(item)
}
subscript(i: Int) -> Int {
return items[i]
}
}
// Такая же структура, но для String. `Item` выводится как `String`.
struct StringStack: Container {
var items = [String]()
var count: Int { return items.count }
mutating func append(_ item: String) {
items.append(item)
}
subscript(i: Int) -> String {
return items[i]
}
}Для чего это нужно:
Гибкость: Один протокол может быть принят множеством разных типов, работающих с разными данными.
Безопасность типов: Компилятор следит за тем, чтобы типы были согласованы. В примере выше IntStack может работать только с Int.