如何使用可选方法创build协议?

我注意到在iPhone SDK中定义的几个协议中标记为可选的方法,例如UIActionSheetDelegate协议。

我怎样才能定义一个我自己的协议,并设置一些方法为可选的?

从“ 正式协议 ”的苹果页面:

可选协议方法可以使用@optional关键字标记为可选。 对应于@optional模式关键字,有一个@required关键字来正式表示默认行为的语义。 你可以使用@optional和@required将你的协议分成几个部分,只要你认为合适。 如果您不指定任何关键字,则默认为@required。

 @protocol MyProtocol - (void)requiredMethod; @optional - (void)anOptionalMethod; - (void)anotherOptionalMethod; @required - (void)anotherRequiredMethod; @end 

如果协议中的某个方法被标记为可选,则在尝试调用该方法之前,您必须检查一个对象是否实现了该方法。

例如,饼图视图可能会像这样testing段标题方法:

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

respondsToSelector:方法使用一个select器,它在编译之后引用一个方法的标识符。 您可以使用@selector()指令并指定方法的名称来提供正确的标识符。

如果本例中的数据源实现该方法,则使用标题; 否则,标题仍然是零。

在方法声明之前使用@optional关键字使其成为可选项。 就那么简单!

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

协议是一组规则。 我们可以创build如下的协议:

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.m

 #import "TestClass.h" @implemenation TestClass //optional to implement -(void)testMethodOptional{ // Your Code } //required to implement -(void)testMethodRequired{ // Your Code } @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