在静态函数中传递Self

时间:2017-09-18 22:22:55

标签: ios swift generics

我正在使用从带有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
  • 还添加了全局功能的示例
  • 此处是指向sample project
  • 的链接

2 个答案:

答案 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;并让编译器推断出类型。