如何在 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)
当 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)