SwiftUI: Struct View vs @ViewBuilder

Sep 10 2020

Jeśli chcę wyrenderować listę elementów w SwiftUI, mógłbym zrobić coś takiego (używając 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()
        }
    }
}

Zamiast być strukturą, MyRowmoże być funkcją, dzięki czemu kod jest nieco bardziej zwięzły i funkcjonalny:

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

Chciałbym zrozumieć różnicę między tymi dwoma podejściami. Czy są przypadki, w których wolisz jedno od drugiego?

Pierwszą rzeczą, która przychodzi na myśl, jest to, że nie możesz mieć @Statewłaściwości z funkcjami, co oznacza, że ​​musisz użyć tego structpodejścia, jeśli twój widok wymaga stanu.

Czy to wszystko? Czy są przypadki, w których jedno podejście jest lepsze pod względem optymalizacji? Debugowanie? Funkcje? Ruchliwość?

Odpowiedzi

ChristophePrat Sep 09 2020 at 23:35

@ViewBuilderjest najczęściej używany do warunkowego renderowania widoków bez użycia parserów, takich jak AnyView(YourView). Cytując witrynę Apple Developera : „Klienci tej funkcji mogą używać zamknięć z wieloma instrukcjami, aby udostępniać kilka widoków podrzędnych”. Na przykład, jeśli chcesz wyświetlić widok zależny od zmiennej, tj. Renderowanie Widok1, jeśli dana zmienna jest prawdziwa, i Widok2, jeśli jest fałszywa.