Добавить объявление

@ViewBuilder: магия композиции в SwiftUI

Всем привет! Сегодня разберем @ViewBuilder - один из ключевых механизмов SwiftUI, который делает наш код таким лаконичным и выразительным.

Что такое @ViewBuilder:


Это специальный атрибут, который превращает несколько View в одну иерархию. Благодаря ему мы пишем так:

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

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

Image(systemName: "apple.logo")
}

Вместо такого кошмара:

VStack(content: {
TupleView(
Text("Привет"),

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

Image(systemName: "swift")
)
})

Как это работает:



Автоматическая упаковка:

@ViewBuilder преобразует список вьюх в TupleView (для 2-10 элементов) или Group (если их больше).


Поддержка условий:

Может обрабатывать if, if let, switch:

@ViewBuilder
func header(isLoggedIn: Bool) -> some View {
if isLoggedIn {
Text("Добро пожаловать!")
} else {
Button("Войти") {
// Действие
}
}
}


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

  • Нельзя использовать for напрямую (нужен ForEach).

  • Максимум 10 вьюх в одном блоке (но это ограничение обходится).

Продвинутые фишки:


  • Комбинирование с @resultBuilder.

    Можно создать свой билдер для специфичных задач:

    @resultBuilder
    struct GridBuilder {
    static func buildBlock(_ items: AnyView...) -> [AnyView] {
    items
    }
    }

  • Обход ограничения в 10 вьюх.

    Для этого стоит использовать Group:

    @ViewBuilder
    func megaView() -> some View {
    Group {
    Text("1")
    ...
    Text("11") // Работает!
    }
    }


Вывод:


@ViewBuilder - это мощный инструмент SwiftUI, который превращает декларативный код в иерархию View, делая интерфейсы гибкими и читаемыми.
08.08.2025 13 418