SwiftUI: struct View vs @ViewBuilder

Sep 10 2020

Se eu quiser renderizar uma lista de itens no SwiftUI, posso fazer algo assim (usando o 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()
        }
    }
}

Em vez de ser uma estrutura, MyRowpode ser uma função, o que torna o código um pouco mais conciso e funcional:

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

Eu gostaria de entender a diferença entre as duas abordagens. Existem casos em que você prefere um em vez do outro?

A primeira coisa que vem à mente é que você não pode ter @Statepropriedades com funções, o que significa que você precisa usar a structabordagem se sua visualização precisar de estado.

Isso é tudo? Existem casos em que uma abordagem é melhor em termos de otimização? Depurando? Características? Portabilidade?

Respostas

ChristophePrat Sep 09 2020 at 23:35

@ViewBuilderé usado principalmente para renderizar visualizações condicionalmente sem usar analisadores como AnyView(YourView). Para citar o site do desenvolvedor da Apple : "Os clientes desta função podem usar encerramentos de várias instruções para fornecer várias visualizações filho". Por exemplo, se você quiser mostrar uma visão dependendo de uma variável, isto é, renderizar a visão 1 se uma determinada variável for verdadeira e a visão 2 se for falsa.