DevPrep

Все темы › Язык Swift

Что такое associated type в протоколе?

Middle PRO

Суть

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

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store