0

我有一个核心数据 NSManagedObject 实体Person,它具有一个作为 NSNumber 生成的 Bool 属性。(未使用“使用标量类型”复选框,因此 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似乎行不通,我还必须考虑可选部分。

4

1 回答 1

0

一种可能的方法是通过自定义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)
于 2021-06-02T17:09:14.630 回答