SwiftUI如何实现可变Binding默认值 替代不可变的Binding.constant
解决方案
核心思路:Binding 本身不存储状态,仅提供对底层状态的读写接口,不可变的 Binding.constant 没有可写入的状态源。我们只需为无参初始化场景增加一个仅在内部使用的 @State 作为状态源,即可实现可变的默认绑定。
完整实现代码
struct View1: View { @Binding var myVariable: Bool // 内部私有状态,仅为无参初始化提供可变状态源 @State private var internalVariable: Bool = true // 无参初始化:绑定到内部状态 init() { _myVariable = Binding( get: { internalVariable }, set: { internalVariable = $0 } ) } // 带参初始化:直接使用外部传入的绑定 init(myVariable: Binding<Bool>) { _myVariable = myVariable } var body: some View { Button("Change") { myVariable.toggle() } } } // 调用方式保持不变 struct View2: View { var body: some View { View1() // 无参调用,使用内部可变状态 } } struct View3: View { @State var myVariable = false var body: some View { View1(myVariable: $myVariable) // 传参调用,使用外部状态 } }
更简洁的合并初始化写法
你也可以把两个初始化方法合并为一个,通过可选参数默认值实现同样效果:
struct View1: View { @Binding var myVariable: Bool @State private var internalVariable: Bool init(myVariable: Binding<Bool>? = nil) { if let externalBinding = myVariable { _myVariable = externalBinding // 外部传参时内部状态无意义,随便设初始值即可 _internalVariable = State(initialValue: false) } else { // 无参时绑定内部状态,设置默认初始值为true _internalVariable = State(initialValue: true) _myVariable = Binding( get: { internalVariable }, set: { internalVariable = $0 } ) } } var body: some View { Button("Change") { myVariable.toggle() } } }
内容的提问来源于stack exchange,提问作者Alperen Örence
相关产品推荐
相关产品推荐

