我注意到在iPhone SDK中定义的几个协议中标记为可选的方法,例如UIActionSheetDelegate
协议.
如何定义自己的协议,并将一些方法设置为可选?
来自" 正式协议 " 的Apple页面:
可以使用@optional关键字将可选协议方法标记为可选.对应于@optional modal关键字,有一个@required关键字来正式表示默认行为的语义.您可以使用@optional和@required将协议划分为您认为合适的部分.如果未指定任何关键字,则默认为@required.
@protocol MyProtocol - (void)requiredMethod; @optional - (void)anOptionalMethod; - (void)anotherOptionalMethod; @required - (void)anotherRequiredMethod; @end
如果协议中的方法被标记为可选,则必须在尝试调用之前检查对象是否实现该方法.
例如,饼图视图可能会测试段标题方法,如下所示:
NSString *thisSegmentTitle; if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) { thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index]; }
respondsToSelector:方法使用一个选择器,它在编译后引用方法的标识符.您可以使用@selector()指令并指定方法的名称来提供正确的标识符.
如果此示例中的数据源实现该方法,则使用标题; 否则,标题仍为零.
协议是一套规则.我们可以创建协议,如下例所示:
TestProtocols.h
@protocol TestProtocols@optional -(void)testMethodOptional; @required // by default -(void)testMethodRequired; @end
执行:
TestClass.h
#import "TestProtocols.h" @interface TestClass : NSObject@end
TestClass.m
#import "TestClass.h" @implemenation TestClass //optional to implement -(void)testMethodOptional{ // Your Code } //required to implement -(void)testMethodRequired{ // Your Code } @end
@optional
在方法声明之前使用关键字使其成为可选项.就那么简单!
// myProtocol.h @protocol myProtocol - (void)myMandatoryMethod:(id)someArgument; @optional - (void)myOptionalMethod:(id)someArgument; @end
// myClass.m @interface myClass : someSuperClass//... @end
协议的作用与抽象类相同,因此@optional关键字定义了对于实现而言是可选的那些方法。
因此,在代码中,someMethod1,someMethod2和someMethod4是必需的方法(必须实现)。someMethod3是可选的-如果我们未实现此方法,则编译器将不会引发任何警告。
@protocol myPrtocol-(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 //... @end