@ViewBuilder 在属性上与 init 中,存储闭包或结果值

Coc*_*uts 2 swiftui

有什么区别:

@ViewBuilder财产上

struct SomeView<Content:View>: View {
    @ViewBuilder var content: () -> Content
}
Run Code Online (Sandbox Code Playgroud)

init,存储闭包

struct SomeView2<Content:View>: View {
    var content: () -> Content
    
    init(@ViewBuilder content: @escaping () -> Content) {
        self.content = content
    }
}
Run Code Online (Sandbox Code Playgroud)

init,存储结果值

struct SomeView3<Content:View>: View {
    var content: Content
    
    init(@ViewBuilder content: () -> Content) {
        self.content = content()
    }
}
Run Code Online (Sandbox Code Playgroud)

所有解决方案似乎都有效。那么为什么人们会选择其中一种而不是另一种呢?

mal*_*hal 5

有人在今年的休息室询问,苹果工程师建议存储结果值。

\n
\n

问:但是,\xe2\x80\x99s 为自定义组件使用 @ViewBuilder 的推荐方法是什么:在 init() 中立即调用它并存储视图,\n也不要稍后在主体内调用它并存储视图建造者\本身?

\n

答:我们\xe2\x80\x99d 通常建议立即解决它并\n存储视图

\n
\n

https://onmyway133.com/posts/wwdc-swiftui-lounge/#use-viewbuillder

\n

例如这个版本

\n
struct SomeView3<Content:View>: View {\n    let content: Content\n    \n    init(@ViewBuilder content: () -> Content) {\n        self.content = content()\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n