2011-04-30 19 views
1

我有一個協議,我有兩個方法如下。設置任何一個委託方法是@required

@protocol ActionPerformerDelegate <NSObject> 

@required 

    - (void)actionCompleted; 
    - (void)actionCompletedWithMessage:(NSString *)message; 

@end 

如果一個類確認了這個協議,那麼這個類應該實現這些方法中的至少一個。我知道@必需@optional關鍵字。如果我使用@required,Xcode會警告我實現這兩種方法。如果我使用@optional Xcode不會警告我實現任何方法。如何指定實施任何一種方法是必要的?

回答

4

協議方法是必需的或可選的;在編譯時無法檢查你要求的內容。但是,您可以將這兩種方法標記爲可選,並檢查您的委託在運行時實現的方式。類似於以下內容:

// In ActionPerformer.m. 
SEL selector = @selector(actionCompletedWithMessage:); 
if ([self.delegate respondsToSelector:selector]) { 
    // ... 
} else if ([[self.delegate class] respondsToSelector:selector]) { 
    // ... 
} else { 
    [NSException raise:NSInvalidArgumentException format:@"delegate doesn't " 
     "implement actionCompletedWithMessage:."]; 
}