You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用@ViewBuilder替代AnyView实现视图作为另一视图参数

用@ViewBuilder替代AnyView传递视图参数的实现方案

你可以通过泛型+@ViewBuilder的方式替代AnyView,既能保留视图类型信息、避免类型擦除的开销,还能获得更灵活的视图构建语法。具体修改如下:

1. 保留原有的View1和View2(无需修改)

struct View1: View {
    let title: String
    let text: String

    var body: some View {
        HStack {
            Text(title)
            Text(text).bold()
        }
    }
}

struct View2: View {
    let title: String
    let text: String

    var body: some View {
        HStack {
            Text(title).bold()
            Text(text)
        }
    }
}

2. 修改ParameterView,使用泛型+@ViewBuilder

把原来的any View参数替换为@ViewBuilder修饰的泛型闭包,这样就能直接接收任意视图内容:

struct ParameterView<Content: View>: View {
    let title: String
    @ViewBuilder let content: () -> Content

    var body: some View {
        HStack {
            Text(title)
            content() // 直接调用闭包生成视图,无需AnyView包装
        }
    }
}

3. 调用方式(更简洁灵活)

使用尾随闭包传入视图内容,不仅可以传入View1/View2,还能直接组合任意视图:

struct ParameterView_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            ParameterView(title: "Noodles") {
                View1(title: "£", text: "1.00")
            } // 输出:Noodles £ 1.00

            ParameterView(title: "Mass") {
                View2(title: "100", text: "g")
            } // 输出:Mass 100 g

            // 额外示例:直接组合多个原生视图
            ParameterView(title: "Custom") {
                Text("Hello").foregroundColor(.red)
                Text("World").italic()
            }
        }
    }
}

方案优势

  • 避免AnyView的类型擦除,保留视图的原始类型信息,性能更优
  • @ViewBuilder支持SwiftUI的视图构建语法,允许传入单个或多个视图(自动合并为TupleView)
  • 调用代码更简洁,可读性更强

内容的提问来源于stack exchange,提问作者jarnold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:21:36