クラスのインスタンスをObjective-Cの@protocolにキャストします
-
03-07-2019 - |
質問
定義したプロトコルに準拠する場合としない場合があるオブジェクト(UIViewController)があります。
オブジェクトがプロトコルに準拠しているかどうかを判断し、メソッドを安全に呼び出すことができることを知っています:
if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) {
[self.myViewController protocolMethod]; // <-- warning here
}
ただし、XCodeは警告を表示します:
warning 'UIViewController' may not respond to '-protocolMethod'
この警告を防ぐ正しい方法は何ですか? self.myViewController
クラスとしてMyProtocol
をキャストできないようです。
解決
これを行う正しい方法は次のとおりです。
if ([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
UIViewController <MyProtocol> *vc = (UIViewController <MyProtocol> *) self.myViewController;
[vc protocolMethod];
}
UIViewController <MyProtocol> *
型キャストは<!> quotに変換されます; vcはMyProtocol <!> quot;に準拠するUIViewControllerオブジェクトですが、id <MyProtocol>
を使用すると<!> quot; vcに変換されますMyProtocol <!> quot;に準拠する未知のクラス。
このように、コンパイラはvc
で適切な型チェックを行います-コンパイラは、UIViewController
または<MyProtocol>
で宣言されていないメソッドが呼び出された場合にのみ警告を表示します。 id
は、キャストされるオブジェクトのクラス/タイプがわからない場合にのみ使用してください。
他のヒント
次のようにキャストできます:
if([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
id<MyProtocol> p = (id<MyProtocol>)self.myViewController;
[p protocolMethod];
}
これも少し私を投げました。 Objective-Cでは、プロトコルは型そのものではないため、必要なプロトコルとともにid
(またはNSObject
などの他の型)を指定する必要があります。
所属していません StackOverflow