簡體   English   中英

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

[英]How can I reference the Self type in a `class func` in an extension for a class

所以這有點棘手,但我將概述要點:

  • 我在預編譯框架的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" }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM