2008-11-26 92 views
119

我注意到在iPhone SDK中定義的幾種協議中標記爲可選的方法,例如UIActionSheetDelegate協議。如何使用可選方法創建協議?

我該如何定義自己的協議,並將其中一些方法設置爲可選項?

回答

226

從蘋果頁上的 「Formal Protocols」:

任擇議定書 方法可以使用關鍵字@optional被標記爲可選 。 對應於@optional模式 關鍵字,有一個@required關鍵字 正式表示默認行爲的語義 。您可以使用 @optional和@required將 您的協議分成多個部分,如您所見 擬合。如果您未指定任何 關鍵字,則默認爲@required。

@protocol MyProtocol 

- (void)requiredMethod; 

@optional 
- (void)anOptionalMethod; 
- (void)anotherOptionalMethod; 

@required 
- (void)anotherRequiredMethod; 

@end 
+1

注意的是:「」「@optional」「」和「」「@required」「」指令適用於它後面的任何方法。 – Wayne 2017-04-07 13:05:54

11

在方法聲明之前使用@optional關鍵字使其成爲可選項。就那麼簡單!

// myProtocol.h 
@protocol myProtocol 
- (void)myMandatoryMethod:(id)someArgument; 
@optional 
- (void)myOptionalMethod:(id)someArgument; 
@end
// myClass.m 
@interface myClass : someSuperClass <myProtocol> 
    //... 
@end
3

協議充當相同抽象類,所以@optional關鍵字定義那些可選實施方法。

因此,在代碼中,someMethod1,someMethod2和someMethod4是必需的方法(必須實現)。 someMethod3是可選的 - 如果我們沒有實現這個方法,編譯器不會拋出任何警告。

@protocol myPrtocol<NSObject> 

-(void)someMethod1:(id)someArgument; 
-(void)someMethod2:(id)someArugument; 

@optional 

-(void)someMethod3:(id)someArgument; 

@required //by default 

-(void)someMethod4:(id)someArgument; 

@end 

// sampleClass.m 
@interface sampleClass : someSuperClass <myProtocol> 
//... 
@end 
23

如果在協議的方法被標記爲可選,你必須檢查試圖調用它之前的對象是否實現該方法。

作爲一個例子,餅圖視圖可能測試像這樣的段標題方法:

NSString *thisSegmentTitle; 
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) { 
    thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index]; 
} 

的respondsToSelector:方法使用的選擇器,它指的是標識符編譯後的方法。您可以使用@selector()指令並指定方法的名稱來提供正確的標識符。

如果本例中的數據源實現該方法,則使用標題;否則,標題仍然爲零。

+5

確保在協議中擴展NSObject以使用respondsToSelector – Fracdroid 2015-08-28 22:51:19

8

協議是一組規則。我們可以創建協議,如下面的例子:

TestProtocols.h

@protocol TestProtocols <NSObject> 
    @optional 
    -(void)testMethodOptional; 

    @required // by default 
    -(void)testMethodRequired; 
@end 

實現:

TestClass.h

#import "TestProtocols.h" 
@interface TestClass : NSObject <TestProtocols> 

@end 

識別TestClass。米

#import "TestClass.h" 
@implemenation TestClass 
    //optional to implement 
    -(void)testMethodOptional{ 
    // Your Code 
    } 

    //required to implement 
    -(void)testMethodRequired{ 
    // Your Code 
    } 
@end 
相關問題