106

定義したプロトコルに準拠している場合と準拠していない場合があるオブジェクト (UIViewController) があります。

オブジェクトがプロトコルに準拠しているかどうかを判断し、メソッドを安全に呼び出すことができることはわかっています。

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) {
    [self.myViewController protocolMethod]; // <-- warning here
}

ただし、XCode には次の警告が表示されます。

warning 'UIViewController' may not respond to '-protocolMethod'

この警告を防ぐ正しい方法は何ですか? クラスself.myViewControllerとしてキャストできないようです。MyProtocol

4

2 に答える 2

177

これを行う正しい方法は次のとおりです。

if ([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
        UIViewController <MyProtocol> *vc = (UIViewController <MyProtocol> *) self.myViewController;
        [vc protocolMethod];
}

型キャストはUIViewController <MyProtocol> *「vc は MyProtocol に準拠する UIViewController オブジェクトです」にid <MyProtocol>変換しますが、使用すると「vc は MyProtocol に準拠する未知のクラスのオブジェクトです」に変換されます。

このようにして、コンパイラは適切な型チェックを提供します。vcコンパイラは、宣言されていないメソッドUIViewControllerまたは<MyProtocol>呼び出されたメソッドがある場合にのみ警告を出します。idキャストされるオブジェクトのクラス/タイプがわからない場合にのみ使用してください。

于 2010-11-26T01:47:56.103 に答える
63

次のようにキャストできます。

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
    id<MyProtocol> p = (id<MyProtocol>)self.myViewController;
    [p protocolMethod];
}

これもちょっと気になりました。Objective-C では、プロトコルは型そのものではないため、必要なプロトコルと共にid(または などの他の型) を指定する必要があります。NSObject

于 2009-03-06T03:38:17.903 に答える