SwiftUI: Tampilan struct vs @ViewBuilder

Sep 10 2020

Jika saya ingin membuat daftar item di SwiftUI, saya bisa melakukan sesuatu seperti ini (menggunakan 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()
        }
    }
}

Alih-alih menjadi struct, MyRowbisa menjadi fungsi, yang membuat kode sedikit lebih ringkas dan fungsional:

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()
    }
}

Saya ingin memahami perbedaan antara kedua pendekatan tersebut. Apakah ada kasus di mana Anda lebih memilih salah satu daripada yang lain?

Hal pertama yang terlintas dalam pikiran adalah Anda tidak dapat memiliki @Stateproperti dengan fungsi, yang berarti Anda perlu menggunakan structpendekatan jika tampilan Anda memerlukan status.

Apakah itu semuanya? Adakah kasus di mana satu pendekatan lebih baik dalam hal pengoptimalan? Debugging? Fitur? Portabilitas?

Jawaban

ChristophePrat Sep 09 2020 at 23:35

@ViewBuilderkebanyakan digunakan untuk merender tampilan secara bersyarat tanpa menggunakan parser like AnyView(YourView). Mengutip situs web Pengembang Apple : "Klien dari fungsi ini dapat menggunakan penutupan beberapa pernyataan untuk memberikan beberapa tampilan anak". Misalnya, jika Anda ingin menampilkan tampilan yang bergantung pada variabel, yaitu merender View1 jika variabel tertentu benar dan View2 jika salah.