2011-01-08 100 views
6

我想擴展或添加另一種方法到現有的協議。雖然協議特別不重要,但這正是我想要做的。如何將方法添加到Cocoa中的現有協議?

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

編譯器警告我有相同協議的重複聲明。我將如何正確地做到這一點?

謝謝。

回答

12

您無法爲協議定義類別。有兩種方法解決此問題:

  • 使用新的正式協議
  • 使用一個非正式的協議和運行時檢查

正式協議

定義一個新的正式協議是這樣的:

@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

相關問題