0Pricing
Swift Academy · Урок

associatedtype и обобщённые протоколы

Определяйте протоколы с associatedtype , смотрите, как соответствующие типы связывают их, и используйте обобщённые функции с ограничениями протоколов.

«associatedtype и обобщённые протоколы» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.

Зачем нужны связанные типы

Протоколы могут быть обобщёнными с помощью связанных типов. Соответствующие типы связывают этот заполнитель с конкретным типом.

Протокол со связанным типом

Связанный тип Item играет роль параметра типа. Требования могут использовать его в методах, индексаторах и свойствах.

protocol Container {
    associatedtype Item
    mutating func append(_ item: Item)
    var count: Int { get }
    subscript(index: Int) -> Item { get }
}

Соответствие конкретному типу

Соответствующий протоколу тип выбирает конкретный Item — в данном случае целое число, — реализуя требования с этим типом.

struct IntStack: Container {
    // Binds Item == Int implicitly by usage
    private var items: [Int] = []
    mutating func append(_ item: Int) { items.append(item) }
    var count: Int { items.count }
    subscript(index: Int) -> Int { items[index] }
}
var st = IntStack()
st.append(10); st.append(20)
print(st.count, st[1])

Обобщённый соответствующий тип

Обобщённый тип может соответствовать протоколу, связывая Item == Element, благодаря чему протокол остаётся обобщённым и пригодным для повторного использования.

struct Stack<Element>: Container {
    private var items: [Element] = []
    mutating func append(_ item: Element) { items.append(item) }
    var count: Int { items.count }
    subscript(index: Int) -> Element { items[index] }
    // Here, associatedtype Item == Element
}
var s = Stack<String>()
s.append("hi"); s.append("bye")
print(s.count, s[1])

Использование протокола в обобщениях

Ограничивайте функции условием C: Container. Вы можете использовать C.Item абстрактно, не фиксируя конкретный тип.

// Generic algorithm operating on any Container
func dumpFirstTwo<C: Container>(_ c: C) {
    // We can talk about C.Item but not assume concrete type
    if c.count >= 2 {
        print("0:", c[0])
        print("1:", c[1])
    } else {
        print("too few elements")
    }
}
dumpFirstTwo(s)    // works with Stack<String>
dumpFirstTwo(st)   // works with IntStack

Примечания и советы

Примечания:

  • Протоколы со связанными типами нельзя напрямую использовать как типы; предпочитайте обобщения или стирание типов.
  • Давайте заполнителям понятные имена (Item, Element).
  • Соответствие можно указать явно (typealias Item = ...) или вывести из сигнатур.

Значение связанного типа

Быстрая проверка: что означает associatedtype?

Итоги

Итоги: используйте связанные типы, чтобы сделать протоколы обобщёнными. Соответствующие типы выбирают конкретный тип, а обобщённые функции могут работать с любым соответствующим типом благодаря ограничениям.

Часто задаваемые вопросы

Урок «associatedtype и обобщённые протоколы» бесплатный?

Да — полный текст урока «associatedtype и обобщённые протоколы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.

Чему я научусь в уроке «associatedtype и обобщённые протоколы»?

Определяйте протоколы с associatedtype , смотрите, как соответствующие типы связывают их, и используйте обобщённые функции с ограничениями протоколов. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «associatedtype и обобщённые протоколы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. associatedtype и обобщённые протоколы
  2. Шаблоны стирания типов (AnySequence/AnyIterator)
  3. Когда использовать existential (any P), а когда — generics
← Назад к Swift Academy