0Pricing
Swift Academy · Урок

Создание мини-DSL с помощью построителей результатов

Создайте небольшой DSL с помощью @resultBuilder : определите функции построителя, объединяйте блоки и поддерживайте условные конструкции и циклы для удобного чтения.

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

Зачем нужны построители результатов?

Цель: превращать понятные блоки в значения с помощью @resultBuilder. Вы определяете, как объединяются элементы, а место вызова остаётся чистым и декларативным.

Небольшой построитель

Мы объявляем buildBlock, чтобы объединять элементы, и предоставляем программный интерфейс (lines{}), возвращающий массив строк из понятного блока.

@resultBuilder
struct StringListBuilder {
    static func buildBlock(_ parts: String...) -> [String] { parts }
    // Optional support for conditionals/arrays:
    static func buildEither(first: [String]) -> [String] { first }
    static func buildEither(second: [String]) -> [String] { second }
    static func buildArray(_ components: [[String]]) -> [String] { components.flatMap { $0 } }
}

// DSL entry function using the builder
func lines(@StringListBuilder _ content: () -> [String]) -> [String] {
    content()
}

// Usage: create an array of strings with a block
let list = lines {
    "Hello"
    "Swift"
    "Builders"
}
print(list)

Условия в построителях

С помощью buildEither конструкция if/else работает внутри блока. Построитель решает, какая ветвь будет включена в результат.

let showExtra = true
let conditional = lines {
    "Base"
    if showExtra {
        "Extra"
    } else {
        "Hidden"
    }
}
print(conditional)  // ["Base","Extra"]

Циклы в построителях

buildArray собирает результаты циклов (for/map), поэтому повторяющиеся части можно естественным образом добавлять в результат.

let items = ["a","b","c"]
let looped = lines {
    for x in items { x.uppercased() } // contributes ["A","B","C"]
}
print(looped)

Построитель одного значения

Построители могут выдавать одно значение. Здесь мы объединяем части в одну строку, по-прежнему используя условные конструкции.

@resultBuilder
struct TextBuilder {
    static func buildBlock(_ parts: String...) -> String {
        parts.joined(separator: " ")
    }
    static func buildEither(first: String) -> String { first }
    static func buildEither(second: String) -> String { second }
    static func buildArray(_ components: [String]) -> String {
        components.joined(separator: " ")
    }
}

func text(@TextBuilder _ content: () -> String) -> String { content() }

// Compose a small sentence with conditions
let loggedIn = false
let sentence = text {
    "[INFO]"
    "Welcome,"
    if loggedIn { "user!" } else { "guest." }
}
print(sentence) // "[INFO] Welcome, guest."

Советы по проектированию

Советы:

  • Делайте DSL минимальными и специализированными.
  • Предоставляйте одну понятную входную функцию, аннотированную вашим построителем.
  • Поддерживайте только необходимое: buildBlock, buildEither, buildArray.
  • Документируйте, какие инструкции разрешены внутри блока.

Назначение построителя результата

Быстрая проверка: в чём главное преимущество построителя результата?

Итоги

Итоги: определяйте методы @resultBuilder для объединения частей, предоставляйте небольшой входной интерфейс и составляйте понятные блоки с поддержкой условных конструкций и циклов.

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

Урок «Создание мини-DSL с помощью построителей результатов» бесплатный?

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

Чему я научусь в уроке «Создание мини-DSL с помощью построителей результатов»?

Создайте небольшой DSL с помощью @resultBuilder : определите функции построителя, объединяйте блоки и поддерживайте условные конструкции и циклы для удобного чтения. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

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

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

Сколько времени занимает урок «Создание мини-DSL с помощью построителей результатов»?

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

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

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

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

  1. Создание мини-DSL с помощью построителей результатов
  2. API с ограниченной областью действия и приёмы повышения читаемости
  3. Практические примеры без UI-фреймворков
← Назад к Swift Academy