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 对象”,而 using转换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 回答