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

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

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

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> *类型转换转换为“vc 是符合 MyProtocol 的 UIViewController 对象”,而使用 id <MyProtocol>转换为“vc 是符合 MyProtocol 的未知类的对象”。

这样编译器会给你正确的类型检查vc - 只有在 UIViewController 上没有声明的任何方法时,编译器才会给你一个警告。或 <MyProtocol>叫做。 id仅应在您不知道要转换的对象的类/类型的情况下使用。

https://stackoverflow.com/questions/617616/

相关文章:

objective-c - 使用 NSPredicate 根据 NSDictionary 键过滤 N

objective-c - 容器 View Controller 示例

iphone - "wait_fences: failed to receive reply: 10

objective-c - 数字后的 "f"

ios - 横向模式下的 iPhone 应用程序,2008 系统

objective-c - 从 NSString 中删除字符?

iphone - 是否有记录的方法来设置 iPhone 方向?

iphone - Xcode 调试器 : view value of variable

iphone - 如何拦截点击 UITextView 中的链接?

objective-c - 如何获取 Root View Controller ?