簡體   English   中英

ObjC class object 可以符合協議嗎?

[英]Can an ObjC class object conform to a protocol?

有沒有辦法向編譯器表明 class object 符合協議?

據我了解,通過創建+(void)foo class 方法,該 class object 的實例將把這些方法作為實例方法 因此,只要我為所有必需的協議方法創建+(void)foo方法,我就可以讓 class object 充當委托。

我的問題當然是在班級的 header 文件中,我只知道如何指示 class 的實例符合協議(通常是這種情況)。 所以,我想出的最好辦法是像這樣投射 class object:

something.delegate = (id<SomethingDelegate>)[self class]

有任何想法嗎?

相關但不同: ObjC:是否存在“類協議”之類的東西?

您現在所做的是正確的,因為它會使警告靜音,這是您的目標。 您將發送協議中為實例定義的 class object 消息,這有點令人困惑,但運行時並不關心。

以這種方式思考:您想要將委托設置為 object 以響應協議中定義的消息。 你的 class 就是這樣做的,你的 class 也是一個 object。因此,你應該像對待符合該協議的 object 一樣對待你的 class。 因此,你寫的是完全正確的(基於你正在嘗試做的事情)。

不過,需要注意的一件事是 class 不會正確響應 conformsToProtocol conformsToProtocol: 無論如何,這對於委托設置來說通常是可以的(委托通常不檢查 class 是否符合——它們只是檢查它是否可以響應選擇器)。

作為旁注,您可以在語法上做的一件事是:

Class<SomethingDelegate> variable = (Class<SomethingDelegate>)[self class];

這里的區別在於編譯器將使用協議中的 class 方法而不是實例消息。 不過,這不是您想要的。

沒有 Objective-C 語法來指示元類符合協議。

我認為您可以在運行時通過在元類上使用class_addProtocol來完成。 但我沒試過。

我想你也可以在你的 class 上寫一個+conformsToProtocol:方法,然后謊稱你的一致性。 這可能會產生意想不到的副作用,因為NSObject上已經有一個+conformsToProtocol: conformsToProtocol: (除了-conformsToProtocol:之外)。

這些都不會消除強制轉換以關閉編譯器的需要。 只需使用 singleton。

暫無
暫無

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

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