【问题标题】:'Bool' is not convertible to 'Binding<Bool>' in SwiftUI'Bool' 在 SwiftUI 中不能转换为 'Binding<Bool>'
【发布时间】:2019-07-21 13:49:35
【问题描述】:

我正在开发一个 SwiftUI 原生 Watch 应用程序。我有一个基于Combine 的类,它允许我存储`\userDefaults,其中之一是一个简单的切换。

import SwiftUI  
import Foundation  
import Combine  


class MeetingSetup: BindableObject {  

    let willChange = PassthroughSubject<Void, Never>()  

    var twitterEnabled: Bool = false {  
        didSet {  
            willChange.send()  
        }  
    }  

    init() {  
        let prefs:UserDefaults = UserDefaults(suiteName: "group.com.appname")!  
        twitterEnabled = prefs.bool(forKey: "keyTwitterEnabledBool")  
    }  
} 

SwiftUI 中,我收到Bool 无法转换为Binding&lt;Bool&gt; 的错误消息

import SwiftUI  
import Combine  

struct SetupView : View {  

    @ObjectBinding var meetingSetup: MeetingSetup = delegate.meetingSetup  

    var body: some View {  

                HStack{  
                    Toggle(isOn: self.meetingSetup.twitterEnabled){  // <== 'Bool' in not convertible to 'Binding<Bool>'  
                        Text("Twitter")  
                    }  
    }  
} 

我不明白为什么会收到消息,因为代码是@ObjectBinding,根据定义它不应该是Binding&lt;Bool&gt; 吗?如果不是,我该如何正确解决这个问题??

【问题讨论】:

    标签: swiftui combine


    【解决方案1】:

    你错过了美元符号:

    Toggle(isOn: self.$meetingSetup.twitterEnabled) { ... }
    

    我还注意到您在@BindableObject 中使用了didSet,但您确实应该使用willSet

    最后,也许您粘贴不完整,但您的视图中缺少右括号。

    如果您不知道美元符号的用途,请查看 SwiftUI 中的 WWDC2019 视频数据流。

    【讨论】:

    • 谢谢!这有帮助..缺少的括号来自粘贴问题。那么 didSet 表示变化来自数据存储区,而 willSet 表示变化来自屏幕?还是我需要同时设置 didSet 和 willSet 设置?
    • 那么我是否使用 willSet 来显示初始数据来自屏幕而不是数据集?
    • 当你的可绑定对象改变一个值时,你需要让 SwiftUI 知道它。你可以通过调用 willChange.send() 来做到这一点。在 beta 4 之前,您只需对变量进行更改后调用它。所以我们过去常常在 didSet 中调用它。从 beta 4 开始,Apple 更改了 BindableObject 协议,并且通知必须在发出之前完成。所以现在,我们只使用 willSet 来调用 willChange.send()。至于 SwiftUI 所做的更改(即,当您拨动开关时),您无需执行任何操作。通过使用绑定,框架可以解决这个问题。
    • Apple 在 beta 4 中做出了这一改变,这就是为什么你会看到这么多使用 didSet 的示例的原因,它们是在上周一发布 beta 4 之前编写的。
    猜你喜欢
    • 2020-03-29
    • 2017-11-12
    • 2020-09-03
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多