クラスのインスタンスをObjective-Cの@protocolにキャストします

StackOverflow https://stackoverflow.com/questions/617616

  •  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などの他の型)を指定する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top