使用目标 c 中的类别私下扩展协议

Posted

技术标签:

【中文标题】使用目标 c 中的类别私下扩展协议【英文标题】:extend a protocol privately using a category in objective c 【发布时间】:2011-03-14 17:17:11 【问题描述】:

进行了一些搜索,但没有找到太多,但想知道是否可以扩展协议。

目前,在 MyDelegate.h 中有:

@protocol MyDelegate <NSObject>

希望创建一个私有标头 MyDelegate+Private.h,以不向客户端公开额外的可选方法。

@protocol MyDelegate (Private) <NSObject>

这似乎不起作用。是否可以?希望避免创建一个包含当前协议超集的全新委托协议。

【问题讨论】:

Defining categories for protocols in Objective-C? 的可能重复项 看到了,但认为这是一个稍微不同的问题,除非我误解了。 (很有可能。对 objc 还不太熟悉)。他正在尝试将方法添加到使用带有类别的协议的实现中。我想用更多可选方法签名来扩展协议的可选部分,但不要通过将其放在私有标头中的类别中来让公众知道它。 【参考方案1】:

我认为您不能在协议上创建类别,但您可以使用协议创建协议并将其保存在私有标头中。 Apple 在其框架中经常这样做。

@protocol MyDelegate_Private <MyDelegate>
- (void)myRequiredPrivateMethod;
@optional
- (void)myOptionalPrivateMethod;
@end

然后你在声明类时指定这个协议。要隐藏存在私有协议的事实,请使用将类声明为实现公共协议的公共标头和将其声明为实现私有协议的私有标头。

另外,如果你只在协议中使用可选方法,你真的不需要制定协议。它所做的只是指定可以实现的方法列表,并且因为它只是私下使用,所以没有必要。您可以说该类实现了公共协议,并且“恰好”还实现了接口中未包含的这些其他方法。

【讨论】:

非常感谢您的回复。说得通。我期待着尝试这些!

以上是关于使用目标 c 中的类别私下扩展协议的主要内容,如果未能解决你的问题,请参考以下文章

类扩展 vs 主接口 vs 类别

目标 C:通过自定义根类允许类别中的属性

多个类别名称未显示通知内容扩展?

调用类方法并返回目标 c 类别的字典

OC中的类别Category-协议Protocol-… - 韩俊强的博客 - 博客频道 - CSDN.NET

2-1 OC 类别(分类)