【问题标题】:Category for a class that conforms to a protocol [duplicate]符合协议的类的类别[重复]
【发布时间】:2026-02-02 22:45:02
【问题描述】:

我正在尝试为 UIViewController 实现一个类别,并且我想确定该对象符合某个协议。像这样的:

#import <UIKit/UIKit.h>

@interface UIViewController<MyProtocol> (Category)

@end

这可能吗?

【问题讨论】:

标签: objective-c objective-c-category objective-c-protocol


【解决方案1】:

交换类别和协议:

@interface UIViewController (Category) <MyProtocol>

【讨论】:

  • 我不希望类实现协议。我想确保该类别的基类确实如此。我通过将 self 转换为一个临时指针并在那里声明它的协议来解决这个问题。 id castedSelf = (id)self;
  • 选角无法确定。一个类别知道它的基类。它不是一个混合。所以基类可以简单的实现协议,在接口上声明,类就可以知道了。
  • 在将消息发送到在 ARC 下实现协议的基类的属性/方法中,强制转换是必需的。如果我的基类是 NSObject 并实现了一个协议,那么省略协议声明会给我留下一个几乎无用的基类。是的,选角并不确定。这就是我最初希望解决的问题。
  • 在没有声明的情况下在 NSObject 中实现了哪个(正式)协议?
  • 协议不正式。这是我自己的。我正在 NSObject 上创建一个类别,它可以充当我创建的另一种对象的委托。使用类别允许可移植性。使用协议允许类别操作基础对象以响应委托回调,而无需知道它是什么类型的对象。