将一个类的实例转换为Objective-C中的@protocol
-
03-07-2019 - |
题
我有一个对象(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&lt; MyProtocol&gt; *
type-cast转换为“vc是符合MyProtocol的UIViewController对象”,而使用 id&lt; MyProtocol&gt;
转换为“vc是未知类的对象符合MyProtocol&quot;。
这样编译器会在 vc
上给你正确的类型检查 - 如果在 UIViewController
或上没有声明任何方法,编译器只会给你一个警告>&lt; MyProtocol&gt;
被调用。如果您不知道正在投射的对象的类/类型,则 id
只应在这种情况下使用。
其他提示
你可以像这样投射:
if([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
id<MyProtocol> p = (id<MyProtocol>)self.myViewController;
[p protocolMethod];
}
这也让我感到有些失望。在Objective-C中,协议本身不是类型,因此您需要指定 id
(或其他类型,例如 NSObject
)以及您的协议想。
不隶属于 StackOverflow