如何在 SwiftUI 中使用 BindingConvertible?

How to Use BindingConvertible in SwiftUI?

当 Core Data 创建一个 NSManagedObject Subclass 时,它会将字符串属性转换为类似 @NSManaged public var name: String? 的内容(已编辑)

但是当尝试在 SwiftUI TextField 中使用 name 时,您 运行 遇到了问题:

@Binding var entry: Entry
TextField($entry.name)

无法构建,出现以下错误:

'Binding< String?>' is not convertible to 'Binding< String>'

所以我尝试使用BindingConvertible来修复错误:

extension Optional: BindingConvertible where Wrapped == String {
    public var binding: Binding<String> {
        let boundVal = Binding(getValue: , setValue: )
        return boundVal
}

但我不确定要在初始化程序的 getValue: , setValue: 部分中放入什么,并且无法在文档或其他地方找到任何答案。

理想情况下,如果展开的字符串为 nil,则 Binding 将收到一个空字符串,否则它将收到该值。对于设置,如果该字段的值为空字符串,name 应保持为零,否则它的展开值应为 TextField 的内容。关于如何使这项工作有任何想法吗?

你说“它将 String 属性转换为 @NSManaged public var name: String 之类的东西”,但根据错误,它转换为 @NSManaged public var name: String?.

如果您不想在数据模型中关闭 name 的“可选”设置,则可以向 Entry 添加一个 non-optional 访问器,如下所示:

extension Entry {
    var nameNonOptional: String {
        get { name ?? "" }
        set { name = newValue.isEmpty ? nil : newValue }
    }
}

然后您可以绑定到新的访问器:

TextField($entry.nameNonOptional)