1.什么是@ViewBuilder?

从字面意思去理解 ViewBuilder 就是视图构建,其主要使用场景就是构建视图。 在Apple的官方文档中有这样一句话

// 允许闭包中提供多个子视图
allowing those closures to provide multiple child views 

在系统框架中,View定义有@ViewBuilder

public protocol View {
    associatedtype Body : View
    @ViewBuilder var body: Self.Body { get }
}

2.使用@ViewBuilder自定义视图

struct RedBackgroundAndCornerView<Content: View>: View {
    let content: Content
    
    init(@ViewBuilder content: () -> Content) {
        self.content = content()
    }
    
    var body: some View {
        content
            .background(Color.red)
            .cornerRadius(5)
    }
}

RedBackgroundAndCornerView {
    Text("Hello World")
}

可以添加存储变量

struct RedBackgroundAndCornerView<Content: View>: View {
    let content: Content
    @State var needHidden: Bool = false
    
    init(@ViewBuilder content: () -> Content) {
        self.content = content()
    }
    
    var body: some View {
        content
            .background(Color.red)
            .cornerRadius(5)
            .opacity(needHidden ? 0.0 : 1.0)
            .onTapGesture {
                self.needHidden = true
        }
    }
}

这种自定义视图的模式非常像设计模式的装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

参考:https://juejin.cn/post/6844904160609959944