无法推断通用参数“主题”

时间:2019-07-17 12:11:48

标签: swift generics core-data swiftui

背景

我有一个核心数据实体 string BeneficiaryName = "ABCD"; string status = "Active"; tblcell = new TableCell(); if(status == "Active") { tblcell.Text = BeneficiaryName + " " + status ; } ,它与另一个实体Entry有关系:

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 }) } 看起来像这样:

DataField

class DataField: NSManagedObject { //[...] @NSManaged var value: String } 是我对整件事的包装:

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) } } 作为EntryStore传递给SceneDelegate

问题

尽管我可以将@EnvironmentObject的其他属性与SwiftUI文本字段一起使用,但是当我尝试使用Entity时却遇到此错误:

  

无法推断出通用参数'Subject'

代码:

DataField

我已经读到,此错误的一般形式是未明确键入变量的结果,但我尝试过强制转换该表达式的各种方式,但无济于事。另外,就其价值而言,当我将struct ContentView: View { @EnvironmentObject var model: EntryStore var body: some View { TextField($model.entries.first!.dataFields.first!.value) } } 转换内联移动到TextField时,Xcode中的红线似乎在.allObjects上:

dataFields

关于如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:2)

问题是dataFields的值更改时没有通知PasstrhoughSubject-意味着它不能用作绑定。

这就是我最终的目的(对于beta 4也有一些改动)-首先给Entry一个发布者:

public class Entry: NSManagedObject, BindableObject {
    public let willChange = PassthroughSubject<Entry, Never>()

然后使用设置器和获取器来向Combine框架发出更改警报:

var dataFields: [DataField] {
    set {
        willChange.send(self)
    }
    get {
        let arr = stringFields?.allObjects as! [DataField]
        return arr.sorted(by: { $0.order < $1.order })
    }
}

}

现在dataFields可用于绑定