当前位置:  开发笔记 > IOS > 正文

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

如何解决《如何使用可选方法创建协议?》经验,为你挑选了5个好方法。

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

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



1> Matt Gallagh..:

来自" 正式协议 " 的Apple页面:

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

@protocol MyProtocol

- (void)requiredMethod;

@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;

@required
- (void)anotherRequiredMethod;

@end


请注意:'''@ action'''和'''@ required'''指令适用于其后的任何方法.

2> Zephyr..:

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

例如,饼图视图可能会测试段标题方法,如下所示:

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

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

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


确保在协议中扩展NSObject以使用respondsToSelector

3> Vikram Biwal..:

协议是一套规则.我们可以创建协议,如下例所示:

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



4> e.James..:

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

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



5> 小智..:

协议的作用与抽象类相同,因此@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

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有