我注意到在iPhone开发工具包中定义的几个协议中标记为可选的方法,例如UIActionSheetDelegate
协议。
我如何定义自己的协议,并将一些方法设置为可选的?
发布于 2014-09-03 22:52:05
如果协议中的方法被标记为可选,则在尝试调用该方法之前,必须检查对象是否实现了该方法。
例如,饼图视图可能会测试段标题方法,如下所示:
NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}
respondsToSelector:方法使用选择器,它引用编译后的方法的标识符。您可以通过使用@selector()指令并指定方法的名称来提供正确的标识符。
如果本例中的数据源实现了该方法,则使用title;否则,title保持为空。
发布于 2008-11-26 23:21:25
在方法声明之前使用@optional
关键字使其成为可选的。就这么简单!
// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
//...
@end
发布于 2014-05-07 15:26:32
协议的作用与抽象类相同,因此@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
https://stackoverflow.com/questions/322498
复制相似问题