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をレンダリングします。