Рекурсивные ограничения и обобщения высшего порядка
Пишите рекурсивные ограничения (например, для вложенных последовательностей) и обобщённые функции высшего порядка , принимающие обобщённые замыкания или функции.
«Рекурсивные ограничения и обобщения высшего порядка» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
Что и зачем
В этом уроке рассматриваются:
- Рекурсивные ограничения: ограничения для вложенных обобщённых членов (например, последовательность последовательностей);
- Обобщения высшего порядка: обобщённые функции, принимающие обобщённые замыкания или функции.
Вложенные последовательности (выпрямление)
Классический пример рекурсивного ограничения: требуется C.Element: Sequence, чтобы можно было перебирать элементы на двух уровнях вложенности.
// Works for any Collection whose elements are Sequences
func flatten<C: Collection>(_ c: C) -> [C.Element.Element]
where C.Element: Sequence {
var result: [C.Element.Element] = []
result.reserveCapacity(c.reduce(0) { $0 + ($1 as AnySequence<C.Element.Element>).underestimatedCount })
for inner in c {
for e in inner { result.append(e) }
}
return result
}
let nested = [[1,2], [3], [4,5]]
print(flatten(nested)) // [1,2,3,4,5]Обобщённое отображение вложенных элементов
Мы задаём два ограничения: C: Collection и C.Element: Collection, что позволяет вызывать map на каждом уровне.
// Map over a two-level structure without fixing concrete types
func mapNested<C: Collection, R>(_ c: C, _ transform: (C.Element.Element) -> R) -> [[R]]
where C.Element: Collection {
return c.map { inner in inner.map(transform) }
}
let doubled = mapNested([[1,2],[3]], { $0 * 2 })
print(doubled) // [[2,4],[6]]compose(f,g)
Обобщения высшего порядка: функция обобщается по самим функциям, создавая повторно используемые конвейеры, например compose.
// Compose two generic transforms that work on the same element type
func compose<A, B, C>(
_ f: @escaping (B) -> C,
_ g: @escaping (A) -> B
) -> (A) -> C {
{ a in f(g(a)) }
}
let toString: (Int) -> String = { "\\($0)" }
let length: (String) -> Int = { $0.count }
let intToLen = compose(length, toString)
print(intToLen(1234)) // 4Параметры обобщённого замыкания
Замыкание f также является обобщённым параметром. Мы сохраняем гибкость типов с помощью ограничений.
// A generic "transform each" that accepts ANY transform (generic in T/U)
func transformEach<T, U, C: Collection>(_ c: C, using f: (T) -> U) -> [U]
where C.Element == T {
var out: [U] = []
out.reserveCapacity(c.count)
for x in c { out.append(f(x)) }
return out
}
let words = ["swift","kit"]
print(transformEach(words, using: { $0.uppercased() })) // ["SWIFT","KIT"]Рекомендации
Советы:
- Записывайте минимальный набор нужных ограничений (
SequenceвместоCollection). - Для удобства чтения предпочитайте предложения с ограничениями.
- Проверяйте код на нескольких конкретных типах, чтобы убедиться в его обобщённости.
- Документируйте предположения (например, порядок элементов и их уникальность).
Определение обобщений высшего порядка
Быстрая проверка: что делает функцию обобщённой функцией высшего порядка?
Повторение
Повторение: используйте рекурсивные ограничения (например, C.Element: Sequence) для работы с вложенными обобщениями; используйте обобщения высшего порядка, чтобы аккуратно составлять повторно используемые конвейеры функций.
Изучай Swift с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 122
- Уроки
- 409
Часто задаваемые вопросы
Урок «Рекурсивные ограничения и обобщения высшего порядка» бесплатный?
Да — полный текст урока «Рекурсивные ограничения и обобщения высшего порядка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «Рекурсивные ограничения и обобщения высшего порядка»?
Пишите рекурсивные ограничения (например, для вложенных последовательностей) и обобщённые функции высшего порядка , принимающие обобщённые замыкания или функции. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «Рекурсивные ограничения и обобщения высшего порядка»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Условное соответствие протоколам
- Рекурсивные ограничения и обобщения высшего порядка
- Условия where в расширениях