所以这有点棘手,但我将概述要点:
- 我在一个预编译框架的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" }
}
}