类别可以同时实现协议吗?

Jus*_*rls 27 cocoa protocols objective-c categories

如果我为类创建的类别添加的方法也符合协议规定的合同,我想将该类别标记为实现协议,从而向Obj-C预处理器指示class也有效地实现了协议.

示例代表(为了清楚起见,感谢Ole!):

@protocol SomeDelegate <NSObject>
  - (void)someDelegateMessage;
@end
Run Code Online (Sandbox Code Playgroud)

示例类别:

@interface NSObject (SomeCategory) <SomeDelegate>
  - (void)someDelegateMessage;    
@end
Run Code Online (Sandbox Code Playgroud)

并且具有其他典型的实现

@implement NSObject (SomeCategory)
  - (void)someDelegateMessage {}
@end
Run Code Online (Sandbox Code Playgroud)

当我实际尝试这个时,我会收到每个NSObject方法的警告:

警告:类别'SomeCategory'的执行不完整

警告:找不到'-description'的方法定义

...

警告:找不到'-isEqual:'的方法定义

警告:类别'SomeCategory'没有完全实现'NSObject'协议

如果我<SomeDelegate>从声明中删除,工作正常,但当然NSObject不被识别为SomeDelegate

Jen*_*ton 13

解决方法是在没有实现的类别上声明协议,并在不同的类别中实现该方法,例如:

@interface NSObject (SomeCategory) <SomeDelegate>
  - (void)someDelegateMessage;    
@end

@implementation NSObject (SomeCategory_Impl)
  - (void)someDelegateMessage {}
@end
Run Code Online (Sandbox Code Playgroud)

如果这样做,NSObject将被视为<SomeDelegate>在编译时符合,并且运行时检查someDelegateMessage将成功.但是,conformsToProtocol:运行时检查将失败.

当然,您应该提交一个错误,请求在核心类上声明的方法不会生成警告.


Ole*_*ann 5

您的协议声明是否包含NSObject协议?像这样:

@protocol SomeDelegate <NSObject>
...
Run Code Online (Sandbox Code Playgroud)

这就是警告的来源,因为现在您的类别没有实现完整的协议.在我输入的测试代码中,NSObject从协议中删除会删除编译器警告.