SwiftUI: struct View vs @ViewBuilder

Sep 10 2020

Si je veux rendre une liste d'éléments dans SwiftUI, je pourrais faire quelque chose comme ça (en utilisant 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()
        }
    }
}

Au lieu d'être une structure, MyRowpeut être une fonction, ce qui rend le code un peu plus concis et fonctionnel:

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

J'aimerais comprendre la différence entre les deux approches. Y a-t-il des cas où vous préféreriez l'un à l'autre?

La première chose qui vient à l'esprit est que vous ne pouvez pas avoir de @Statepropriétés avec des fonctions, ce qui signifie que vous devez utiliser l' structapproche si votre vue a besoin d'un état.

Est-ce tout? Y a-t-il des cas où une approche est meilleure en termes d'optimisation? Débogage? Caractéristiques? Portabilité?

Réponses

ChristophePrat Sep 09 2020 at 23:35

@ViewBuilderest principalement utilisé pour restituer des vues de manière conditionnelle sans utiliser d'analyseurs tels que AnyView(YourView). Pour citer le site Web d'Apple Developer : "Les clients de cette fonction peuvent utiliser des fermetures à plusieurs instructions pour fournir plusieurs vues enfants". Par exemple, si vous souhaitez afficher une vue en fonction d'une variable, c'est-à-dire rendre View1 si une certaine variable est vraie et View2 si elle est fausse.