所以这有点棘手,但我将概述要点:
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个子类中都具有相同的类函数只是令人讨厌的事情
最重要的是,如果我能弄清楚如何实现此模式,我们还有其他地方可以减少重复代码
答案 0 :(得分:0)
Self用于查找当前实例,但是在Class函数中,它是在类而不是类的实例上调用的。您应该做的是在课堂上称呼它。使用您的示例,您应该这样做:
@objc(Subclass) final class Subclass: BaseClass {
class func fetchAllNoBilly() -> Set<Subclass> {
return Subclass.fetchAll().filter{ return $0.name != "Billy" }
}
}