我正在使用从 Objective-C 与 MagicalRecord 迁移到 Swift 与 CoreStack(用作核心数据框架)。 CoreStack 有以下 API 来获取记录,如下所示:
CoreStore.fetchOne(From<NSManagedObject>, Where("id == '123'))
我有一个 NSManagedObject 的基类 - Record,并且希望有一个静态函数来返回 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')
但我找不到将“Self”类传递给此函数的方法。我得到的主要是一个错误:无法显式专门化通用函数
我尝试使用全局函数(而不是方法),因此限制较少:
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
- 还添加了全局函数的示例
- 这里是 sample project 的链接
最佳答案
您不能在静态函数中直接使用 self,因为 self 引用一个实例,其中静态函数/属性引用类本身。
考虑 Person.find(id: '123') 行。 123 是每个 Person 对象上完全相同的属性还是每个 Person 都有不同的 id?当前 id 是实例的属性。每个 Person 对象都可以有不同的 id。如果它是一个类属性,那么每个实例都将具有相同的 id。
关于ios - 在静态函数中传递 Self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46288998/