1. ホーム
  2. objective-c

[解決済み] Objective-Cでクラスのインスタンスを@protocolにキャストする

2022-10-26 01:44:06

質問

私が定義したプロトコルに準拠するかしないかわからないオブジェクト(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> * のタイプキャストは "vc is a UIViewController object that conforms to MyProtocol" と変換されますが、を使用すると id <MyProtocol> を使うと "vc is an object of an unknown class that conforms to MyProtocol" に変換されます。

このようにすると、コンパイラは適切な型チェックで vc - のどちらかで宣言されていないメソッドがある場合、 コンパイラは警告を出すだけです。 UIViewController または <MyProtocol> が呼び出されます。 id は、キャストされるオブジェクトのクラスや型が分からない場合にのみ使用されるべきです。