我注意到在iPhone SDK中定義的幾種協議中標記爲可選的方法,例如UIActionSheetDelegate
協議。如何使用可選方法創建協議?
我該如何定義自己的協議,並將其中一些方法設置爲可選項?
我注意到在iPhone SDK中定義的幾種協議中標記爲可選的方法,例如UIActionSheetDelegate
協議。如何使用可選方法創建協議?
我該如何定義自己的協議,並將其中一些方法設置爲可選項?
從蘋果頁上的 「Formal Protocols」:
任擇議定書 方法可以使用關鍵字@optional被標記爲可選 。 對應於@optional模式 關鍵字,有一個@required關鍵字 正式表示默認行爲的語義 。您可以使用 @optional和@required將 您的協議分成多個部分,如您所見 擬合。如果您未指定任何 關鍵字,則默認爲@required。
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
在方法聲明之前使用@optional
關鍵字使其成爲可選項。就那麼簡單!
// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
//...
@end
協議充當相同抽象類,所以@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
如果在協議的方法被標記爲可選,你必須檢查試圖調用它之前的對象是否實現該方法。
作爲一個例子,餅圖視圖可能測試像這樣的段標題方法:
NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}
的respondsToSelector:方法使用的選擇器,它指的是標識符編譯後的方法。您可以使用@selector()指令並指定方法的名稱來提供正確的標識符。
如果本例中的數據源實現該方法,則使用標題;否則,標題仍然爲零。
確保在協議中擴展NSObject以使用respondsToSelector – Fracdroid 2015-08-28 22:51:19
協議是一組規則。我們可以創建協議,如下面的例子:
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
注意的是:「」「@optional」「」和「」「@required」「」指令適用於它後面的任何方法。 – Wayne 2017-04-07 13:05:54