SwiftUI: struct View เทียบกับ @ViewBuilder
หากฉันต้องการแสดงรายการใน 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()
}
}
ฉันต้องการเข้าใจความแตกต่างระหว่างสองแนวทางนี้ มีบางกรณีที่คุณต้องการมากกว่าอีกกรณีหนึ่งหรือไม่?
สิ่งแรกที่ควรคำนึงถึงคือคุณไม่สามารถมี@Stateคุณสมบัติที่มีฟังก์ชันได้ซึ่งหมายความว่าคุณต้องใช้structแนวทางนี้หากมุมมองของคุณต้องการสถานะ
นั่นหมดแล้วหรือ? มีกรณีใดบ้างที่แนวทางหนึ่งดีกว่าในแง่ของการเพิ่มประสิทธิภาพ? การแก้จุดบกพร่อง? คุณสมบัติ? พกพา?
คำตอบ
@ViewBuilderส่วนใหญ่จะใช้ในการทำให้มุมมองเงื่อนไขโดยไม่ต้องใช้ parsers AnyView(YourView)เช่น หากต้องการอ้างอิงเว็บไซต์ของนักพัฒนาซอฟต์แวร์ Apple : "ไคลเอนต์ของฟังก์ชันนี้สามารถใช้การปิดคำสั่งหลายคำสั่งเพื่อให้มีมุมมองย่อยหลายรายการ" ตัวอย่างเช่นหากคุณต้องการแสดงมุมมองขึ้นอยู่กับตัวแปรเช่นการแสดงผล View1 หากตัวแปรบางตัวเป็นจริงและ View2 หากเป็นเท็จ