如何在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() } }
关键修正点
- 移除
State的嵌套:将@State private var state的类型改为原始值的元组(repeat each T),而非State<each T>的元组。 - 正确生成Binding:通过
Binding(get:set:)构造器,为元组中的每个元素单独生成绑定,确保每个值都能被正确读写。 - 调整init参数语法:使用
repeat initialState: each T替代原写法,符合Swift可变泛型的语法规范。
内容的提问来源于stack exchange,提问作者Trev14
相关产品推荐
相关产品推荐

