绑定常量替代方案,但可变

Alp*_*nce 5 swiftui

我有这样的看法:

struct View1: View {
    @Binding var myVariable: Bool
    
    init() {
        _myVariable = Binding.constant(true) // It works but myVariable is immutable, so I can't edit myVariable
    }
    
    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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要这样做:如果提供了一个参数,请将其设置为 myVariable,就像 View1 中的第二个 init 一样。否则,像第一个 init 中一样设置 myVariable 的第一个值。

我尝试使用 Binding.constant(value) 但它是不可变的。而且我无法编辑该变量。因此,我需要一个可变的 Binding 初始值设定项,例如 Binding.constant(value)。但我找不到它。

我怎么解决这个问题?

Geo*_*e_E -2

为了避免过于复杂View1,您可以创建一个具有该名称的中间视图,然后拥有一个private具有实际实现的“内部”视图。

代码:

private struct View1Internal: View {
    @Binding var myVariable: Bool

    var body: some View {
        Button("Change") {
            myVariable.toggle()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
struct View1: View {
    private enum Kind {
        case state
        case binding(Binding<Bool>)
    }

    @State private var state = true
    private let kind: Kind

    init() {
        kind = .state
    }

    init(myVariable: Binding<Bool>) {
        kind = .binding(myVariable)
    }

    var body: some View {
        switch kind {
        case .state: View1Internal(myVariable: $state)
        case .binding(let binding): View1Internal(myVariable: binding)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)