[英]How can I reference the Self type in a `class func` in an extension for a class
所以這有點棘手,但我將概述要點:
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" }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.