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