Используя объявление VStack
, нам нужно использовать @ViewBuilder
для нашего параметра содержимого.Это замыкание, но оно не должно быть @escaping, не будет хорошо хранить замыкание, если нам нужны только данные из него.Я предполагаю, что из деклараций Apple.
Также я считаю, что @inlinable
важно, потому что:
Атрибут @inlinable экспортирует тело функции как часть интерфейса модуля., делая его доступным для оптимизатора при обращении из других модулей. Подробнее здесь
struct Layout <Content> : View where Content : View {
var content: Content
@inlinable public init(@ViewBuilder content: () -> Content) {
self.content = content()
}
var body : some View {
VStack {
Text("This is a layout")
self.content
}
}
}
Для использования:
Layout {
Text("1")
VStack {
Text("1")
Text("2")
}
}
UPD: As Matteo Pacini отмечена как вводящая в заблуждение информация о @escaping
.
Нам нужно использовать @escaping
для DynamicViewContent
просмотров.@escaping
используется структурами Apple для просмотра структур, принимающих коллекции (массив, диапазон и т. Д.).Потому что ForEach
реализует DynamicViewContent
- тип представления, который генерирует представления из базовой коллекции данных.List
в его инициализаторах также ForEach
в содержимом
public init<Data, RowContent>(_ data: Data, selection: Binding<Selection>?, action: @escaping (Data.Element.IdentifiedValue) -> Void, rowContent: @escaping (Data.Element.IdentifiedValue) -> RowContent) where Content == ForEach<Data, Button<HStack<RowContent>>>, Data : RandomAccessCollection, RowContent : View, Data.Element : Identifiable