如何在SwiftUI中使用BindingConvertible?

时间:2019-07-15 13:47:51

标签: swiftui

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

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

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

无法生成,出现以下错误:

  

'Binding '不能转换为'Binding '

所以我尝试使用BindingConvertible来纠正错误:

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

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

理想情况下,如果未包装的字符串为nil,则Binding将接收一个空字符串,否则它将接收该值。对于设置,如果字段的值为空字符串,则name应该保持为nil,否则它的未包装值应该是TextField的内容。关于如何进行这项工作的任何想法吗?

1 个答案:

答案 0 :(得分:1)

您说过“它将String属性转换为类似@NSManaged public var name: String的内容”,但是基于错误,它将转换为@NSManaged public var name: String?

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

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

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

TextField($entry.nameNonOptional)