我正在使用从带有MagicalRecord的Objective-C迁移到带有CoreStack的Swift(用作核心数据框架)。并且CoreStack具有以下用于获取记录的API,如下所示:
CoreStore.fetchOne(From<NSManagedObject>, Where("id == '123'))
我有一个NSManagedObject的基类 - 记录,并希望有一个静态函数返回一个带ID的记录(任何子类):
class Record : NSManagedObject {
static public func find(id: String) -> Self {
CoreStore.fetchOne(From<Self>, Where("id = '\(id)'"))
}
}
class Person: Record {
var id: String?
}
使用:
Person.find(id: '123')
但是我无法找到通过“自我”的方法。这个函数的类。我得到的主要是一个错误:不能明确地专门化泛型函数
我尝试使用全局函数(不是方法),因此限制较少:
public func findRecord<T: Record>(id: String) -> T {
return CoreStore.fetchOne(From<T>, Where("id = '\(id)'"))
}
在Record
类中使用它,如下所示:
static public func find(id: String) -> Self {
find<Self>(Where("id = '\(id)'"))
}
一切都无济于事。我会很感激任何想法或指针!
更新
class Record : NSManagedObject
答案 0 :(得分:0)
你不能在静态函数中直接使用self,因为self指的是静态函数/属性引用类本身的实例。
考虑一行Person.find(id:'123')。 123是一个在每个Person对象上完全相同的属性,还是每个Person都有不同的id?目前,id是实例的属性。每个Person对象都可以具有不同的id。如果它是一个类属性,那么每个实例都具有相同的id。
答案 1 :(得分:0)
感谢Reinier Melian,答案很简单:
class Record : NSManagedObject {
static public func find(id: String) -> Self {
CoreStore.fetchOne(From(), Where("id = '\(id)'"))
}
}
class Person: Record {
var id: String?
}
CoreStore中的某个地方:
public static func fetchOne<T>(_ from: From<T>, _ fetchClauses: FetchClause...) -> T? {
return self.defaultStack.fetchOne(from, fetchClauses)
}
解决方案:
只需删除括号&lt;&gt;并让编译器推断出类型。