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
可以与绑定一起使用

在上一个示例中,您需要一个?after
stringFields
,因为它是可选的。我假设这就是为什么您会得到一条红线。我最初是这样做的,但由于某些原因,添加?实际上会产生以下错误:
无法对类型为“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 })
    }
}

}