Что такое associated type в протоколе?
Суть
associatedtype — плейсхолдер типа внутри протокола. Протокол описывает, что такой тип есть и каким ограничениям он удовлетворяет, а каждый конформящийся тип подставляет свой конкретный тип (явно через typealias или выводом из сигнатур). Так устроены Sequence.Element, Collection.Index, IteratorProtocol.Element.
protocol Container<Item> {
associatedtype Item: Equatable
var count: Int { get }
mutating func append(_ item: Item)
subscript(i: Int) -> Item { get }
}
struct IntStack: Container {
private var items: [Int] = []
var count: Int { items.count }
// Item = Int выводится из сигнатуры
mutating func append(_ item: Int) { items.append(item) }
subscript(i: Int) -> Int { items[i] }
}
func contains<C: Container>(_ c: C, _ x: C.Item) -> Bool {
(0..<c.count).contains { c[$0] == x }
}
// Swift 5.7+: primary associated type
func sum(_ c: some Container<Int>) -> Int {
(0..<c.count).reduce(0) { $0 + c[$1] }
}
let boxes: [any Container<Int>] = [IntStack()]
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep