在Objective-C中将类的实例投射到@protocol
我有一个对象(一个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> *
types转换转换为“vc是符合MyProtocol的UIViewController对象”,而使用id <MyProtocol>
转换为“vc是符合MyProtocol的未知类的对象”。
这样编译器会给你适当的vc
types检查 – 如果调用了UIViewController
或者<MyProtocol>
没有声明的方法,编译器只会给你一个警告。 只有在你不知道正在被施放的对象的类/types的情况下才应该使用id
。
你可以像这样施放它:
if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) { id<MyProtocol> p = (id<MyProtocol>)self.myViewController; [p protocolMethod]; }
这也让我有点不安。 在Objective-C中,协议不是types本身,所以你需要指定id
(或其他types,比如NSObject
)以及你想要的协议。