SwiftUI: struct View so với @ViewBuilder

Sep 10 2020

Nếu tôi muốn hiển thị danh sách các mục trong SwiftUI, tôi có thể làm như sau (sử dụng 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()
        }
    }
}

Thay vì là một cấu trúc, MyRowcó thể là một hàm, làm cho mã ngắn gọn và có chức năng hơn một chút:

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

Tôi muốn hiểu sự khác biệt giữa hai cách tiếp cận. Có trường hợp nào bạn thích cái này hơn cái kia không?

Điều đầu tiên nghĩ đến là bạn không thể có @Statecác thuộc tính với các hàm, có nghĩa là bạn cần sử dụng structphương pháp này nếu chế độ xem của bạn cần trạng thái.

Đo la tât cả hả? Có trường hợp nào trong đó một cách tiếp cận tốt hơn về mặt tối ưu hóa không? Gỡ lỗi? Đặc trưng? Tính di động?

Trả lời

ChristophePrat Sep 09 2020 at 23:35

@ViewBuilderchủ yếu được sử dụng để hiển thị có điều kiện các chế độ xem mà không cần sử dụng các trình phân tích cú pháp như AnyView(YourView). Trích dẫn trang web của Nhà phát triển Apple : "Khách hàng của chức năng này có thể sử dụng nhiều câu lệnh đóng để cung cấp một số chế độ xem con". Ví dụ: nếu bạn muốn hiển thị một chế độ xem phụ thuộc vào một biến, tức là hiển thị View1 nếu một biến nào đó là true và View2 nếu nó là false.