[英]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.