【发布时间】:2011-01-08 20:00:47
【问题描述】:
我想为现有协议扩展或添加另一种方法。虽然协议并不特别重要,但这是我正在尝试做的。
@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:方法。
解决此问题的方法是通过强制转换重新键入delegate 对象。可能是这样的:
- (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];
}
【讨论】: