Ответ
@ViewBuilder — это атрибут-функциональный строитель (function builder) в SwiftUI, который позволяет декларативно собирать иерархию представлений из нескольких дочерних вью, используя DSL-подобный синтаксис.
Как работает:
Он преобразует несколько выражений внутри замыкания в единый возвращаемый тип some View. Это основа для контейнеров, таких как VStack, HStack, и модификаторов body.
Пример использования в кастомном компоненте:
struct CardView<Content: View>: View {
let content: Content
init(@ViewBuilder content: () -> Content) {
self.content = content()
}
var body: some View {
VStack {
content
}
.padding()
.background(Color.gray.opacity(0.1))
}
}
// Вызов:
CardView {
Text("Заголовок")
Divider()
Text("Описание")
}
Ключевые особенности:
- Поддерживает условную логику (
if,switch) иOptionalразвёртывание. - Не поддерживает произвольные циклы (например,
for). Для динамических списков используйтеForEach. - Имеет ограничение Swift на количество дочерних вью (обычно до 10) в одном блоке.
- Позволяет создавать гибкие и переиспользуемые UI-компоненты.