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

问题描述:

我注意到在iPhone SDK中定义的几种协议中标记为可选的方法,例如UIActionSheetDelegate协议。如何使用可选方法创建协议?

我该如何定义自己的协议,并将其中一些方法设置为可选项?

从苹果页上的 “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

在方法声明之前使用@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()指令并指定方法的名称来提供正确的标识符。

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

+5

确保在协议中扩展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