SwiftUI: struct View vs @ViewBuilder
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
@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.