Swift Academy · Урок

Рекурсивные ограничения и обобщения высшего порядка

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

Урок 2 из 38 шагов

«Рекурсивные ограничения и обобщения высшего порядка» — бесплатный урок 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 — локальная установка не требуется.

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

  1. Условное соответствие протоколам
  2. Рекурсивные ограничения и обобщения высшего порядка
  3. Условия where в расширениях
← Назад к Swift Academy