SwiftUI:如何在`$`可绑定对象运算符之前使用`!`运算符?

Posted

技术标签:

【中文标题】SwiftUI:如何在`$`可绑定对象运算符之前使用`!`运算符?【英文标题】:SwiftUI: How to use `!` operator before `$` bindable object operator? 【发布时间】:2020-02-05 13:23:07 【问题描述】:

我无法将逻辑非 ! 运算符与可绑定 $ 对象一起使用。

这是我想要的场景-

struct ContentView: View 
@State private var isLoggedIn:Bool = true
var body: some View 

    Text("Root View")
        .sheet(isPresented: !self.$isLoggedIn) 
            SignInView()
        
        .onAppear  self.performAuthentication() 
   

一旦我通过一些按钮操作设置isLoggedIn = false,登录视图就会出现。为此我必须在$ 之前使用逻辑非运算符。

编译器错误:无法将“绑定”类型的值转换为 预期的参数类型“布尔”

我怎样才能做到这一点?

【问题讨论】:

我之前回答过类似的问题,请看here 值得一提的是'$' in not 'bindable object operator'。如果您有 @somePropertyWrapper var value:Value = ...,则 $ 前缀运算符会为您提供它的预计值。您可以通过访问 State 的绑定属性从 State 获取绑定。您还可以将 $ 前缀运算符与 State 的任何属性一起使用来创建绑定。 【参考方案1】:

正如我在对问题的评论中所说,SwiftUI: transform Binding into another Binding 发布了一些方法。但是,如果您想明确地将其用作运算符,则可以使用以下内容(经过测试并适用于 Xcode 11.2)

extension Binding where Value == Bool 
    static prefix func !(_ lhs: Binding<Bool>) -> Binding<Bool> 
        return Binding<Bool>(get: !lhs.wrappedValue , 
                             set:  lhs.wrappedValue = !$0)
    

【讨论】:

重新定义!操作员炒锅,但我认为这不是个好主意。你最好避免这样的解决方案...... @user3441734 为什么?这是个好主意(我比之前的 negate 方法更喜欢这个)。 @matt 它确实有效。但是没有看到它的定义,它可能有点不清楚,尤其是设置部分。 !someBool 通常不会更改该值。一年前关于 someInt++ 的讨论很好,而 !someBindigToBool 让我看起来更“不可预测” @user3441734 这是一个公平的观点!您是说negate 的优势在于它可以更清楚地产生一个新的绑定。事实上,有人可能会与我刚才所说的相反,并建议我们将该方法称为 negativeBinding 或类似的方法,以明确它的作用。 @matt .-) 是的。说吧!运算符是返回否定值但不更改原始值的前缀运算符。这就是我所期望的......甚至negativeBinding听起来很奇怪,也许bindingNegativeValue听起来更好。

以上是关于SwiftUI:如何在`$`可绑定对象运算符之前使用`!`运算符?的主要内容,如果未能解决你的问题,请参考以下文章

如何将可观察对象发布的整数变量绑定到 SwiftUI 中的 textField?

SwiftUI ObjectBinding 不会使用 combine 接收来自可绑定对象的 didchange 更新

如何告诉 SwiftUI 视图绑定到多个嵌套的 ObservableObject

如何解开可选的@State以用于调用需要在swiftui中绑定的东西[重复]

Combine + SwiftUI 中的最佳数据绑定实践?

SwiftUI 预览页面,可绑定 URL?