我有一个对象(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*vc = (UIViewController *) self.myViewController; [vc protocolMethod]; }
该UIViewController
型铸造转换为"VC是一个UIViewController对象符合MyProtocol",而使用id
转换为"VC是符合MyProtocol未知类的对象".
通过这种方式,编译器将为您提供正确的类型检查vc
- 如果任何方法未在任何方法上声明UIViewController
或被
调用,编译器将仅向您发出警告.id
只有在您不知道正在投射的对象的类/类型时才应该在这种情况下使用.
你可以这样投:
if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) { idp = (id )self.myViewController; [p protocolMethod]; }
这也让我感到有些失望.在Objective-C中,协议本身不是类型,因此您需要指定id
(或某些其他类型,例如NSObject
)以及您想要的协议.