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

如何在SwiftUI预览中使用Swift参数包实现多值BindingProvider

解决SwiftUI多绑定预览工具的编译错误

你的代码存在明显问题,并非编译器故障。错误根源在于错误嵌套了@State属性包装器——你将@State的类型声明为State<each T>的元组,但@State本身就是属性包装器,不能把另一个State实例作为它的存储值,这会导致编译器无法正确解析属性包装器的逻辑,进而触发编译失败。

修正后的正确实现

利用Swift 5.9的可变泛型(Variadic Generics),我们可以直接将初始值的元组作为@State的存储类型,再为每个元素生成对应的Binding:

struct BindingProvider<repeat each T, Content: View>: View {
    @State private var state: (repeat each T)
    private let content: (repeat Binding<each T>) -> Content
    
    init(repeat initialState: each T, @ViewBuilder content: @escaping (repeat Binding<each T>) -> Content) {
        self._state = State(initialValue: (repeat initialState))
        self.content = content
    }
    
    var body: some View {
        content(repeat Binding(
            get: { state.each },
            set: { state.each = $0 }
        ))
    }
}

验证用法

你可以像预期那样使用这个工具,预览中的控件会完全可交互:

#Preview {
    BindingProvider(true, "Hello") { toggleBinding, textBinding in
        VStack(spacing: 20) {
            Toggle("启用选项", isOn: toggleBinding)
            TextField("输入文本", text: textBinding)
        }
        .padding()
    }
}

关键修正点

  1. 移除State的嵌套:将@State private var state的类型改为原始值的元组(repeat each T),而非State<each T>的元组。
  2. 正确生成Binding:通过Binding(get:set:)构造器,为元组中的每个元素单独生成绑定,确保每个值都能被正确读写。
  3. 调整init参数语法:使用repeat initialState: each T替代原写法,符合Swift可变泛型的语法规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:23:10