SwiftUI:structViewと@ViewBuilder
Sep 10 2020
SwiftUIでアイテムのリストをレンダリングしたい場合は、次のようにすることができます(XCode 12を使用)。
struct MyView: View {
let texts: [String]
var body: some View {
ScrollView {
LazyVStack {
ForEach(texts.indices, id: \.self) { index in
MyRow(label: texts[index])
}
}
}
}
struct MyRow: View {
let label: String
var body: some View {
Text(label).font(.title3).padding()
}
}
}
構造体でMyRowはなく、関数にすることができます。これにより、コードがもう少し簡潔で機能的になります。
struct MyView: View {
let texts: [String]
var body: some View {
ScrollView {
LazyVStack {
ForEach(texts.indices, id: \.self) { index in
MyRow(label: texts[index])
}
}
}
}
@ViewBuilder func MyRow(label: String) -> some View {
Text(label).font(.title3).padding()
}
}
2つのアプローチの違いを理解したいと思います。どちらか一方を優先する場合はありますか?
最初に頭に浮かぶのは、@State関数を持つプロパティを持つことはできないということですstruct。つまり、ビューに状態が必要な場合は、このアプローチを使用する必要があります。
それだけですか?最適化の観点から、1つのアプローチの方が優れている場合はありますか?デバッグしますか?特徴?移植性?
回答
ChristophePrat Sep 09 2020 at 23:35
@ViewBuilder主に、のようなパーサーを使用せずにビューを条件付きでレンダリングするために使用されますAnyView(YourView)。Apple DeveloperのWebサイトを引用すると、「この関数のクライアントは、複数ステートメントのクロージャを使用して、いくつかの子ビューを提供できます」。たとえば、変数に応じてビューを表示する場合、つまり、特定の変数がtrueの場合はView1をレンダリングし、falseの場合はView2をレンダリングします。