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 — локальная установка не требуется.
Все уроки этого курса
- associatedtype и обобщённые протоколы
- Шаблоны стирания типов (AnySequence/AnyIterator)
- Когда использовать existential (any P), а когда — generics