SwiftUI:struct View 与 @ViewBuilder

Sal*_*RYS 13 swiftui

如果我想在 SwiftUI 中渲染项目列表,我可以这样做(使用 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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以是一个函数,而不是MyRow一个结构体,这使得代码更加简洁和实用:

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

我想了解这两种方法之间的区别。是否存在您更喜欢其中一种的情况?

首先想到的是,您不能拥有@State带有函数的属性,这意味着如果您的视图需要状态,则需要使用该struct方法。

这就是全部?是否存在某种方法在优化方面更好的情况?调试?特征?可移植性?

Chr*_*rat 0

@ViewBuilder主要用于有条件地渲染视图,而不使用像AnyView(YourView). 引用苹果开发者网站的一句话:“这个函数的客户端可以使用多语句闭包来提供多个子视图”。例如,如果您想根据变量显示视图,即如果某个变量为 true,则渲染 View1,如果为 false,则渲染 View2。

  • 我明白这一点,但为什么呢?“@ViewBuilder”方法似乎更简洁、可读且切中要害。为什么不在每次不需要“@State”时都使用它呢? (3认同)