当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的内容。关于如何进行这项工作的任何想法吗?
答案 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)