For*_*ord 96 protocols objective-c
我有一个对象(UIViewController),它可能符合也可能不符合我定义的协议.
我知道我可以确定对象是否符合协议,然后安全地调用该方法:
if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) {
    [self.myViewController protocolMethod]; // <-- warning here
}
但是,XCode显示警告:
warning 'UIViewController' may not respond to '-protocolMethod'
什么是防止此警告的正确方法?我似乎无法self.myViewController像一个MyProtocol班级一样.
Nic*_*rge 166
这样做的正确方法是:
if ([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
        UIViewController <MyProtocol> *vc = (UIViewController <MyProtocol> *) self.myViewController;
        [vc protocolMethod];
}
该UIViewController <MyProtocol> *型铸造转换为"VC是一个UIViewController对象符合MyProtocol",而使用id <MyProtocol>转换为"VC是符合MyProtocol未知类的对象".
通过这种方式,编译器将为您提供正确的类型检查vc- 如果任何方法未在任何方法上声明UIViewController或被<MyProtocol>调用,编译器将仅向您发出警告.id只有在您不知道正在投射的对象的类/类型时才应该在这种情况下使用.
And*_*ndy 59
你可以这样投:
if([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
    id<MyProtocol> p = (id<MyProtocol>)self.myViewController;
    [p protocolMethod];
}
这也让我感到有些失望.在Objective-C中,协议本身不是类型,因此您需要指定id(或某些其他类型,例如NSObject)以及您想要的协议.
| 归档时间: | 
 | 
| 查看次数: | 33349 次 | 
| 最近记录: |