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

问题描述:

我想扩展或添加另一种方法到现有的协议。虽然协议特别不重要,但这正是我想要做的。如何将方法添加到Cocoa中的现有协议?

@protocol NSMatrixDelegate 
- (void)myNewMethod:(id)sender; 
@end 

编译器警告我有相同协议的重复声明。我将如何正确地做到这一点?

谢谢。

您无法为协议定义类别。有两种方法解决此问题:

  • 使用新的正式协议
  • 使用一个非正式的协议和运行时检查

正式协议

定义一个新的正式协议是这样的:

@protocol MyCustomMatrixDelegate <NSMatrixDelegate> 

- (void) myNewMethod:(id)sender; 

@end 

然后你会让你的自定义类符合t o <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]; 
} 
+0

我试过了正式协议方法。它可以工作,但编译器会警告在协议中找不到自定义方法。我将正式协议添加到委托的接口,并将委托的头包含在我将委托消息发送到的objet的实现文件中。你知道它为什么还在抱怨吗?谢谢 – David 2011-01-08 20:31:41