Objective-Cランタイム:クラスがプロトコルに準拠しているかどうかを確認する最良の方法?


171

クラス(インスタンスはありません)があり、それが特定のプロトコルに準拠しているかどうかを知る必要があります。ただし、Classは何度もサブクラス化でき、class_conformsToProtocol()はスーパークラスで宣言されたプロトコルを無視します。

私はclass_getSuperclass()を使用して、スーパークラスがnilになるまで、階層内のすべてのクラスを再帰的にチェックすることができます。しかし、それは深くネストされたクラス階層にとって非効率的かもしれないのではないかと思います、そしておそらくそれを行うより良い方法があるでしょうか?

言い換えると、NSObjectメソッドはスーパークラスのプロトコルを見つけるためにObjective-Cランタイムメソッドを使用してどのようにしてconformsToProtocolを最適に実装するのですか?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

クラス階層を再帰的に上っていく正しい方向に進んでいる場合は、お知らせください。

回答:


309

ドキュメントよると

[MyClass conformsToProtocol:@protocol(MyProtocol)];

うまくいくはずです。


4
あなたが正しい。それは遅く、Xcodeによるコード補完の提案はありませんでした。Classの定義をチェックし、それが "typedef struct objc_class * Class"であることを確認したので、NSObjectクラス参照をチェックしませんでした。
LearnCocos2D 2010

クラスではなくインスタンスでそれを行う方法はありますか?私self.delegateは複数のプロトコルを実装しており、クラス以外のプロトコルに準拠しているかどうかを確認したいと思います。
Konrad Piascik

@KonradPiascik代わりにインスタンスで呼び出すだけです[someObject conformsToProtocol:@protocol(MyProtocol)]
Wevah 2018

3

または、次のような一般的なポインタの場合:

Class<MyProtocol> someClassPointer = nil;

あなたは使うことができます:

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.