Swift 通用参数';受试者';无法推断 背景
我有一个核心数据实体Swift 通用参数';受试者';无法推断 背景,swift,generics,core-data,swiftui,Swift,Generics,Core Data,Swiftui,我有一个核心数据实体条目,它与另一个实体数据字段有关系: class Entry: NSManagedObject { //[...] @NSManaged public var stringFields: NSSet? } 因为在大多数情况下,使用NSSet?是不实际的,Entry还有另一个变量: var dataFields: [DataField] { let arr = stringFields?.allObjects as! [DataField]
条目
,它与另一个实体数据字段
有关系:
class Entry: NSManagedObject {
//[...]
@NSManaged public var stringFields: NSSet?
}
因为在大多数情况下,使用NSSet?
是不实际的,Entry
还有另一个变量:
var dataFields: [DataField] {
let arr = stringFields?.allObjects as! [DataField]
return arr.sorted(by: { $0.order < $1.order })
}
而EntryStore
是我对整个事情的包装:
class EntryStore: NSObject, BindableObject {
private lazy var fetchedResultsController: NSFetchedResultsController<Entry> = {
//[...]
fetchedResultsController.delegate = self
return fetchedResultsController
}()
var entries: [Entry] {
return fetchedResultsController.fetchedObjects ?? []
}
let didChange = PassthroughSubject<EntryStore, Never>()
//[...]
}
extension EntryStore: NSFetchedResultsControllerDelegate {
public func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
didChange.send(self)
}
}
我已经读到这个错误的一般形式是由于没有显式地键入变量,但是我尝试了各种方式强制转换这个表达式,但都没有效果。另外,值得一提的是,当我将数据字段
转换内联移动到TextField时,Xcode中的红线似乎位于.allObjects
部分:
TextField(($model.stringFields.allObjects.sort(by: { ($0 as! DataField).order < ($1 as! DataField).order }).first!.value)
TextField($model.stringFields.allObjects.sort(按:{($0 as!DataField).order<($1 as!DataField.order}).first!.value)
关于如何解决这个问题有什么想法吗?问题是,
数据字段
在其值更改时没有通知密码主题
,这意味着它不能用作绑定
以下是我最终得到的结果(beta 4也有一些细微的变化)-首先给出Entry
a Publisher:
public class Entry: NSManagedObject, BindableObject {
public let willChange = PassthroughSubject<Entry, Never>()
现在,
dataFields
可以与绑定一起使用在上一个示例中,您需要一个?afterstringFields
,因为它是可选的。我假设这就是为什么您会得到一条红线。我最初是这样做的,但由于某些原因,添加?实际上会产生以下错误:无法对类型为“Bindin”的非可选值使用可选链接g
好的,绑定似乎是一项新功能,也是我还不熟悉的功能。
TextField(($model.stringFields.allObjects.sort(by: { ($0 as! DataField).order < ($1 as! DataField).order }).first!.value)
public class Entry: NSManagedObject, BindableObject {
public let willChange = PassthroughSubject<Entry, Never>()
var dataFields: [DataField] {
set {
willChange.send(self)
}
get {
let arr = stringFields?.allObjects as! [DataField]
return arr.sorted(by: { $0.order < $1.order })
}
}
}