TGViewer
Мобильный трудоголик Мобильный трудоголик @hardworkerit · 1.65K subscribers
Post #131 924
🔢 Result Builders в SwiftUI: как создать свой DSL.

Привет, друзья! В прошлый раз мы разбирали @ViewBuilder, а сегодня углубимся в его основу и поговорим про resultBuilder, который делает магию SwiftUI возможной.


⚠️ Что такое resultBuilder?

Result Builder (ранее назывался function builder) — это механизм, позволяющий:
🔹 Объединять элементы в единую структуру.
🔹 Создавать собственные мини-языки (DSL) прямо в Swift.
🔹 Писать декларативный код, как в SwiftUI.


🤔 Как работает в SwiftUI?

Когда вы пишете:

VStack {
Text("Привет")

Button("Нажми меня") {
// Действие
}
}


Под капотом @ViewBuilder (частный случай Result Builder) превращает это в TupleView.


✅ Создаём свой Result Builder.

Сделаем билдер для объединения строк с отступами:

@resultBuilder
struct ParagraphBuilder {
// Объединяем строки через \n
static func buildBlock(_ components: String...) -> String {
components.map { "- \($0)" }.joined(separator: "\n")
}

// Поддержка if
static func buildOptional(_ component: String?) -> String {
component ?? ""
}
}

// Использование:
@ParagraphBuilder func makeList() -> String {
"Первый пункт"
"Второй пункт"

if true {
"Случайный пункт"
}
}

print(makeList())

/* Выведет:
- Первый пункт
- Второй пункт
- Случайный пункт
*/



🤔 Где ещё применяется?

1️⃣ Кастомные UI-билдеры.

Например, для декларативного описания таблиц:

@TableBuilder func buildTable() -> Table {
Row {
Cell("A1")
Cell("A2")
}
Row {
Cell("B1")
Cell("B2")
}
}


2️⃣ Конфигурация сетевых запросов:

@RequestBuilder func makeRequest() -> HTTPRequest {
Method(.get)
Path("users")
Query("page", "2")
}


3️⃣ Тестовые данные:

@TestDataBuilder func mockUser() -> User {
Name("Иван")
Age(30)

if isPremium {
Tier(.gold)
}
}



❌ Ограничения:

🔸 Нет поддержки for-циклов (нужно реализовывать buildArray).
🔸 Сложная отладка (ошибки компиляции могут быть непонятными).
🔸 Лимит в 10 элементов (как у @ViewBuilder).


💡 Вывод:

Result Builder — это мощный инструмент Swift, позволяющий создавать собственные DSL-синтаксисы для декларативного описания логики. Он лежит в основе @ViewBuilder и открывает возможности для кастомных решений, но требует внимания к ограничениям вроде обработки условий и лимита элементов.


➡️ Подписаться на канал
Мобильный трудоголик
  • 👍 19
  • ❤ 8
  • 🔥 1
  • 🙏 1
More from @hardworkerit
  1. Oct 9, 2026👨‍💻 Умение адаптироваться - важный навык айтишника, который часто недооценивают. В ИТ не…
  2. Oct 8, 2026🈸 Apple обяжет разработчиков поддерживать iPhone Duo. Apple опубликовала требования к при…
  3. Oct 6, 2026🔢 Swift 6.4: новая диагностика ретейн циклов. В Swift 6.4 появилась новая диагностика, ко…
  4. Oct 4, 2026🔢 SwiftUI: определение угла раскрытия iPhone Duo. В iOS 27.1 появился модификатор .onHing…
  5. Oct 2, 2026👣 Архитекторы, тестировщики и кодеры. Создаем мультиагентную команду Разработка с ИИ-аген…
  6. Oct 1, 2026🔢 Работа с Picture-in-Picture в iOS. Picture-in-Picture - системная функция iOS, которая…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →