如何在类的扩展中引用"class func"中的Self类型



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

  • 我在一个预编译框架的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()

然而,我得到了这个编译器错误:

"自身"仅在协议中可用,或作为阶级;你是说"BaseClass"吗?

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

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

在我们所有的~20个子类中都有相同的类函数,这很烦人

除此之外,如果我能想出如何实现这种模式,我们还可以在其他领域减少重复代码

Self用于查找当前实例,但在class函数中,它是在类上调用的,而不是类的实例。你应该做的是在课堂上发号施令。用你应该做的例子:

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

最新更新