【问题标题】:SwiftUI: How to use `!` operator before `$` bindable object operator?SwiftUI:如何在`$`可绑定对象运算符之前使用`!`运算符?
【发布时间】: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 的任何属性一起使用来创建绑定。

标签: ios swift xcode swiftui


【解决方案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听起来更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2014-06-14
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多