如何向Cocoa中的现有协议添加方法?

如何向Cocoa中的现有协议添加方法?,cocoa,protocols,Cocoa,Protocols,我想在现有协议中扩展或添加另一个方法。虽然协议并不重要,但这正是我要做的 @protocol NSMatrixDelegate - (void)myNewMethod:(id)sender; @end 编译器警告我有相同协议的重复声明。我该如何正确地做到这一点 谢谢。您不能为协议定义类别。有两种解决方法: 使用新的正式协议 使用非正式协议和运行时检查 正式协议 定义新的正式协议如下所示: @protocol MyCustomMatrixDelegate <NSMatrixDelega

我想在现有协议中扩展或添加另一个方法。虽然协议并不重要,但这正是我要做的

@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end
编译器警告我有相同协议的重复声明。我该如何正确地做到这一点


谢谢。

您不能为协议定义类别。有两种解决方法:

  • 使用新的正式协议
  • 使用非正式协议和运行时检查
正式协议 定义新的正式协议如下所示:

@protocol MyCustomMatrixDelegate <NSMatrixDelegate>

- (void) myNewMethod:(id)sender;

@end
(但是,您可能需要先执行一些类型检查,例如:

if ([[self delegate] conformsToProtocol:@protocol(MyCustomMatrixDelegate)]) {
  return (id<MyCustomMatrixDelegate>)[self delegate];
}
return nil;
非正式议定书 对于
NSObject
上的一个类别,这确实是一个别致的名称:

@interface NSObject (MyCustomMatrixDelegate)

- (void) myNewMethod:(id)sender;

@end
那么您就不实现该方法。在将发送该方法的类中,您将执行以下操作:

[[self customDelegate] myNewMethod:obj];
if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) {
  [[self delegate] myNewMethod:someSenderValue];
}

我尝试了正式协议方法。它可以工作,但是编译器警告说在协议中找不到自定义方法。我将正式协议添加到代理的接口,并将代理的头包含在向其发送代理消息的对象的实现文件中。你知道为什么它仍然是comp吗莱宁?谢谢你才华横溢很有魅力谢谢。
if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) {
  [[self delegate] myNewMethod:someSenderValue];
}