如何使用可选方法创建协议?
我注意到在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