将一个类的实例转换为Objective-C中的@protocol

时间:2009-03-06 03:32:25

标签: objective-c protocols

我有一个对象(UIViewController),它可能符合也可能不符合我定义的协议。

我知道我可以确定对象是否符合协议,然后安全地调用方法:

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

然而,XCode显示警告:

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

防止此警告的正确方法是什么?我似乎无法将self.myViewController强制转换为MyProtocol类。

2 个答案:

答案 0 :(得分:160)

执行此操作的正确方法是:

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

UIViewController <MyProtocol> * type-cast转换为“vc是符合MyProtocol的UIViewController对象”,而使用id <MyProtocol>转换为“vc是符合MyProtocol的未知类的对象”。

这样编译器将为vc提供正确的类型检查 - 如果调用未在UIViewController<MyProtocol>上声明的任何方法,编译器将仅向您发出警告。 id只应在您不知道正在投射的对象的类/类型的情况下使用。

答案 1 :(得分:58)

你可以像这样投射:

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

这也让我感到有些失望。在Objective-C中,协议本身不是类型,因此您需要指定id(或其他类型,例如NSObject)以及您想要的协议。