我想扩展或添加另一种方法到现有的协议.虽然协议特别重要,但这正是我想要做的.
@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end
编译器警告我有相同协议的重复声明.我该怎么做呢?
谢谢.
Dav*_*ong 13
您无法定义协议的类别.有两种方法:
定义新的正式协议将如下所示:
@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];
}
| 归档时间: | 
 | 
| 查看次数: | 1155 次 | 
| 最近记录: |