SwiftUI: struct View เทียบกับ @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()
    }
}

ฉันต้องการเข้าใจความแตกต่างระหว่างสองแนวทางนี้ มีบางกรณีที่คุณต้องการมากกว่าอีกกรณีหนึ่งหรือไม่?

สิ่งแรกที่ควรคำนึงถึงคือคุณไม่สามารถมี@Stateคุณสมบัติที่มีฟังก์ชันได้ซึ่งหมายความว่าคุณต้องใช้structแนวทางนี้หากมุมมองของคุณต้องการสถานะ

นั่นหมดแล้วหรือ? มีกรณีใดบ้างที่แนวทางหนึ่งดีกว่าในแง่ของการเพิ่มประสิทธิภาพ? การแก้จุดบกพร่อง? คุณสมบัติ? พกพา?

คำตอบ

ChristophePrat Sep 09 2020 at 23:35

@ViewBuilderส่วนใหญ่จะใช้ในการทำให้มุมมองเงื่อนไขโดยไม่ต้องใช้ parsers AnyView(YourView)เช่น หากต้องการอ้างอิงเว็บไซต์ของนักพัฒนาซอฟต์แวร์ Apple : "ไคลเอนต์ของฟังก์ชันนี้สามารถใช้การปิดคำสั่งหลายคำสั่งเพื่อให้มีมุมมองย่อยหลายรายการ" ตัวอย่างเช่นหากคุณต้องการแสดงมุมมองขึ้นอยู่กับตัวแปรเช่นการแสดงผล View1 หากตัวแปรบางตัวเป็นจริงและ View2 หากเป็นเท็จ