如何在类的扩展名的“类功能”中引用“自我”类型

时间:2018-08-03 02:17:22

标签: swift class-method swift-extensions

所以这有点棘手,但我将概述要点:

  • 我在预编译框架的Objective-C标头中定义了一个类。我们将呼叫BaseClass
  • 该类打算被子类化
  • BaseClass有一个名为fetchAll()的类函数,子类可以调用该函数以返回该子类的所有实例的数组。

例如,SubClass.fetchAll()将返回Set<SubClass>

现在,我想编写一个名为fetchAllNames()的新类函数

理想情况下,它看起来像这样:

extension BaseClass {
  class func fetchAllNoBilly() -> Set<Self> {
    return Self.fetchAll().filter{ return $0.name != "Billy" }
  }
}

然后对于我的一个子类,我只能说

Subclass.fetchAllNames()SubClass3.fetchAllNames()

但是,出现此编译器错误:

  

'Self'仅在协议中或作为方法中的结果时可用   一类;您是说'BaseClass'吗?

我在这里尝试做的可能吗?也许这只是我不应该做的一个坏模式,但是现在我们为每个子类都有一个单独的fetchAllNames()类函子,看起来像这样:

@objc(Subclass) final class Subclass: BaseClass {
  class func fetchAllNoBilly() -> Set<Self> {
    return Self.fetchAll().filter{ return $0.name != "Billy" }
  }
}

在我们所有约20个子类中都具有相同的类函数只是令人讨厌的事情

最重要的是,如果我能弄清楚如何实现此模式,我们还有其他地方可以减少重复代码

1 个答案:

答案 0 :(得分:0)

Self用于查找当前实例,但是在Class函数中,它是在类而不是类的实例上调用的。您应该做的是在课堂上称呼它。使用您的示例,您应该这样做:

@objc(Subclass) final class Subclass: BaseClass {
  class func fetchAllNoBilly() -> Set<Subclass> {
    return Subclass.fetchAll().filter{ return $0.name != "Billy" }
  }
}