SwiftUI-反转布尔绑定

时间:2019-12-24 23:09:13

标签: ios swift xcode swiftui

我在swiftUI视图中具有绑定。类似于:

struct MyCoolView: View { 
    @ObservedObject var viewModel: ViewModel

    var body: some View { 
        Text("Here is a cool Text!").sheet(isPresented: $viewModel.MyProperty) { 
                            SomeModalView()}
        }
} 

我希望isPresented使用属性中存储的 opposite 布尔值。

Swift不会让我做类似

.sheet(isPresented: !$viewModel.MyProperty) 

((这给我一个关于无法将Binding <Bool>转换为Bool的错误)

有关如何处理此问题的任何想法?

4 个答案:

答案 0 :(得分:7)

如何创建自定义前缀运算符?

prefix func ! (value: Binding<Bool>) -> Binding<Bool> {
    Binding<Bool>(
        get: { !value.wrappedValue },
        set: { value.wrappedValue = !$0 }
    )
}

然后,您可以运行代码而无需进行任何修改:

.sheet(isPresented: !$viewModel.MyProperty) 

如果您不喜欢运算符,则可以在Binding类型上创建扩展名:

extension Binding where Value == Bool {
    var not: Binding<Value> {
        Binding<Value>(
            get: { !self.wrappedValue },
            set: { self.wrappedValue = !$0 }
        )
    }
}

,然后做类似的事情:

.sheet(isPresented: $viewModel.MyProperty.not)

甚至尝试使用全局not函数:

func not(_ value: Binding<Bool>) -> Binding<Bool> {
    Binding<Bool>(
        get: { !value.wrappedValue },
        set: { value.wrappedValue = !$0 }
    )
}

并像这样使用它:

.sheet(isPresented: not($viewModel.MyProperty))

答案 1 :(得分:3)

您可以自己建立绑定:

Text("Here is a cool Text!").sheet(isPresented:
         Binding<Bool>(get: {return !self.viewModel.MyProperty},
                       set: { p in self.viewModel.MyProperty = p})
          { SomeModalView()} } 

答案 2 :(得分:3)

根据@ E.Com的回答,这是构造Binding<Bool>的较短方法:

Binding<Bool>(
    get: { !yourBindingBool },
    set: { yourBindingBool = !$0 }
)

答案 3 :(得分:0)

添加扩展名,如下所示:

extension Binding where Value == Bool {
    func negate() -> Bool {
        return !(self.wrappedValue)
    }
}