SwiftUI: struct View vs @ViewBuilder

Sep 10 2020

Se voglio eseguire il rendering di un elenco di elementi in SwiftUI, potrei fare qualcosa di simile (usando 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()
        }
    }
}

Invece di essere una struttura, MyRowpuò essere una funzione, il che rende il codice un po 'più conciso e funzionale:

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

Mi piacerebbe capire la differenza tra i due approcci. Ci sono casi in cui preferiresti uno rispetto all'altro?

La prima cosa che viene in mente è che non puoi avere @Stateproprietà con funzioni, il che significa che devi usare l' structapproccio se la tua vista ha bisogno di uno stato.

È tutto? Ci sono casi in cui un approccio è migliore in termini di ottimizzazione? Debug? Caratteristiche? Portabilità?

Risposte

ChristophePrat Sep 09 2020 at 23:35

@ViewBuilder is mostly used to conditionally render views without using parsers like AnyView(YourView). To quote Apple Developer's website: "Clients of this function can use multiple-statement closures to provide several child views". For example, if you want to show a view depending on a variable, i.e. rendering View1 if a certain variable is true and View2 if it is false.