繁体   English   中英

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

[英]Generic parameter 'Subject' could not be inferred

背景

我有一个核心数据实体Entry ,它与另一个Entity 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作为@EnvironmentObject传递给SceneDelegate。

问题

尽管我可以在SwiftUI TextField中使用Entity其他属性,但是当我尝试使用DataField时却遇到了以下错误:

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

编码:

struct ContentView: View {
    @EnvironmentObject var model: EntryStore
    var body: some View {
        TextField($model.entries.first!.dataFields.first!.value)
    }
}

我已经知道,此错误的一般形式是未明确键入变量的结果,但我尝试过强制将这种表达式强制转换为各种方式的做法,但无济于事。 另外,就其价值而言,当我将dataFields转换内联移动到TextField时,Xcode中的红线似乎在.allObjects部分上:

TextField(($model.stringFields.allObjects.sort(by: { ($0 as! DataField).order < ($1 as! DataField).order }).first!.value)

有想法该怎么解决这个吗?

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

这就是我最终得到的结果(对于beta 4也有一些改动)-首先给Entry发行商:

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

然后使用setter和getter来提醒Combine框架更改:

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

}

现在, dataFields可以与绑定一起使用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM