0Pricing
Swift Academy · Урок

Практические примеры без UI-фреймворков

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

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

Построители результатов не для интерфейса

Удобные DSL можно создавать для множества задач, не связанных с интерфейсом. Мы создадим построители config, запросов, текста и validation. Делайте каждый из них небольшим и специализированным.

Построитель config

Построитель config собирает простые кортежи в словарь. Места вызова выглядят аккуратно и легко просматриваются.

@resultBuilder
struct ConfigBuilder {
    static func buildBlock(_ parts: (String,String)...) -> [String:String] {
        var dict: [String:String] = [:]
        for (k,v) in parts { dict[k] = v }
        return dict
    }
}
func config(@ConfigBuilder _ body: () -> [String:String]) -> [String:String] { body() }

// Use it:
let cfg = config {
    ("ENV", "debug")
    ("API_URL", "https://api.example.com")
    ("RETRY", "3")
}
print(cfg["API_URL"] ?? "missing")

Построитель запросов

Построитель запросов объединяет условия с помощью AND. Мы поддерживаем условные конструкции и циклы через механизмы построителя.

struct Where { let clauses: [String] }
@resultBuilder
struct WhereBuilder {
    static func buildBlock(_ parts: String...) -> Where { Where(clauses: parts) }
    static func buildArray(_ parts: [String]) -> Where { Where(clauses: parts) }
    static func buildEither(first: Where) -> Where { first }
    static func buildEither(second: Where) -> Where { second }
}
func whereClauses(@WhereBuilder _ body: () -> Where) -> Where { body() }

func select(_ table: String, where w: Where) -> String {
    let filter = w.clauses.isEmpty ? "" : " WHERE " + w.clauses.joined(separator: " AND ")
    return "SELECT * FROM \(table)\(filter);"
}

// Use:
let isProd = false
let q = select("users", where: whereClauses {
    "age > 18"
    if isProd { "status = 'active'" } else { "status <> 'deleted'" }
})
print(q)

Построитель текста и Markdown

Построитель текста выдаёт одну строку. Такие помощники, как h2 и bullet, делают блок понятным.

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

func h2(_ s: String) -> String { "## " + s }
func bullet(_ s: String) -> String { "- " + s }

let doc = md {
    h2("Release Notes")
    bullet("Faster build")
    bullet("Smaller binary")
}
print(doc)

Построитель проверки

Соберите validation rules, а затем выполните их как конвейер. Блок остаётся декларативным, а выполнение происходит позже.

struct ValidationResult { let ok: Bool; let messages: [String] }

typealias Rule = (String) -> String?   // nil = OK; otherwise error message

@resultBuilder
struct RulesBuilder {
    static func buildBlock(_ parts: Rule...) -> [Rule] { parts }
    static func buildArray(_ parts: [[Rule]]) -> [Rule] { parts.flatMap { $0 } }
}
func rules(@RulesBuilder _ body: () -> [Rule]) -> [Rule] { body() }

func validate(_ input: String, with rules: [Rule]) -> ValidationResult {
    var msgs: [String] = []
    for r in rules { if let m = r(input) { msgs.append(m) } }
    return ValidationResult(ok: msgs.isEmpty, messages: msgs)
}

// Use:
let rs = rules {
    { $0.isEmpty ? "Must not be empty" : nil }
    { $0.count < 3 ? "Too short" : nil }
}
let out = validate("hi", with: rs)
print(out.ok, out.messages)

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

Советы:

  • Начните с buildBlock; добавляйте поддержку ветвлений и массивов только при необходимости.
  • Делайте выдаваемые типы простыми: строки, массивы, небольшие структуры.
  • Предоставляйте одну входную функцию для каждого DSL (например, config или функцию для текстовой разметки).
  • Документируйте разрешённые инструкции и правила экранирования.

Пример использования построителя не для интерфейса

Быстрая проверка: выберите удачный вариант использования построителя для задачи, не связанной с интерфейсом:

Итоги

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

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

Урок «Практические примеры без UI-фреймворков» бесплатный?

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

Чему я научусь в уроке «Практические примеры без UI-фреймворков»?

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

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

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

Сколько времени занимает урок «Практические примеры без UI-фреймворков»?

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

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

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

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

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