我想扩展或添加另一种方法到现有的协议.虽然协议特别重要,但这正是我想要做的. @protocol NSMatrixDelegate- (void)myNewMethod:(id)sender;@end 编译器警告我有相同协议的重复声明.我该如何正确地做
@protocol NSMatrixDelegate - (void)myNewMethod:(id)sender; @end
编译器警告我有相同协议的重复声明.我该如何正确地做到这一点?
谢谢.
您无法定义协议的类别.有两种方法:>使用新的正式协议
>使用非正式协议和运行时检查
正式议定书
定义新的正式协议将如下所示:
@protocol MyCustomMatrixDelegate <NSMatrixDelegate> - (void) myNewMethod:(id)sender; @end
然后,您将使自定义类符合< MyCustomMatrixDelegate>而不是< NSMatrixDelegate>.如果您使用这种方法,需要注意的事项:[self delegate]可能会被声明为id< NSMatrixDelegate>.这意味着您无法执行[[self delegate] myNewMethod:obj],因为< NSMatrixDelegate>不声明myNewMethod:方法.
解决这个问题的方法是通过强制转换重新键入委托对象.也许是这样的:
- (id<MyCustomMatrixDelegate>) customDelegate { return (id<MyCustomMatrixDelegate>)[self delegate]; }
(但是,您可能希望先进行一些类型检查,例如:
if ([[self delegate] conformsToProtocol:@protocol(MyCustomMatrixDelegate)]) { return (id<MyCustomMatrixDelegate>)[self delegate]; } return nil;
)
然后你会这样做:
[[self customDelegate] myNewMethod:obj];
非正式议定书
对于NSObject上的类别,这实际上是一个奇特的名称:
@interface NSObject (MyCustomMatrixDelegate) - (void) myNewMethod:(id)sender; @end
那你就是不要实现这个方法.在你的类中发送方法,你会做:
if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) { [[self delegate] myNewMethod:someSenderValue]; }