SwiftUI: Tampilan struct vs @ViewBuilder
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
@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.