ios - 在静态函数中传递 Self

标签 ios swift generics

我正在使用从 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/

相关文章:

ios - UISplitViewController : Can DetailViewController load data from MasterVIewController without segueing back?

java - 泛型中的通配符 : "? super T" works while "? extends T" does not?

Swift for-in 循环与枚举自定义 Array2D 类?

ios - 我在 appDelegate 中收到错误?

c# - 为什么在接口(interface)列表中的泛型内部使用私有(private)嵌套类型不是 "inconsistent accessibility"?

java - 在 Java 中创建通用 lambda

ios - Xcode 旧版本不显示 'Alamofire' 及其在自动完成中的方法

javascript - 内联换行符?

iOS 6 无法检查仅包含字母数字字符的字符串

json - 如何将数据序列化为 JSON 对象