从 Core Data 非标量属性更新 SwiftUI 视图

Updating SwiftUI view from Core Data non scalar attribute

我有一个 Core Data NSManagedObject 实体 Person,它有一个 Bool 属性,我将它生成为一个 NSNumber。 (未使用“使用标量类型”复选框,因此 Bool 属性变为 NSNumber) 我正在尝试观察此属性 employed,以控制 UI.

@ObservedObject var person: Person

var body: some View {
    List {
        Section {
            HStack {
                Toggle(isOn: $person.employed) { <-- 1
                    Text("Showing employed content..")
                }
            }
        }
        if person.employed.boolValue {
            Section { } etc

我在“1”收到警告说:Cannot convert value of type 'Binding<NSNumber?>' to expected argument type 'Binding<Bool>' 如何在不将其更改为标量的情况下将 employed 属性用作布尔值?

注意:$person.employed.boolValue好像不行,我还要考虑可选部分。

一种可能的方法是通过自定义 Binding:

Toggle("Showing employed content..", isOn: Binding<Bool>(get: {
         person.employed?.boolValue == true
      }, set: { value in
         person.employed = NSNumber(value: value)
      }))  

现在,如果您希望将其作为计算结果 属性,您可以这样做:

var isEmployed: Binding<Bool> {
    Binding<Bool>(get: {
        person.employed?.boolValue == true
    }, set: { value in
        person.employed = NSNumber(value: value)
    })
}

var body: some View {
    Toggle("Showing employed content..", isOn: isEmployed)
}

此外,这是一个可能的扩展实现,它处理可选的 NSNumber 支持的布尔值(请原谅我糟糕的命名):

extension Binding where Value == NSNumber? {
    var boolBinding: Binding<Bool> {
        Binding<Bool>(get: {
            self.wrappedValue == true
        }, set: { value in
            self.wrappedValue = NSNumber(value: value)
        })
    }
}

可以这样使用:

Toggle("Showing employed content..", isOn: $person.employed.boolBinding)