当前位置 : 主页 > 大数据 > 区块链 >

OC 协议(protocol)

来源:互联网 收集:自由互联 发布时间:2021-06-22
协议的作用与Java中接口的作用非常类似,用于定义类应该遵守的规范,协议不提供实现,只定义规范。协议中定义多个类的公共行为规范,协议通常定义一组公用方法,方法的实现交给
协议的作用与Java中接口的作用非常类似,用于定义类应该遵守的规范,协议不提供实现,只定义规范。协议中定义多个类的公共行为规范,协议通常定义一组公用方法,方法的实现交给类去完成。 协议的基本语法格式如下: @protocol 协议名 <父协议1,父协议2...> //协议方法
@end
协议支持多继承,可以看到上面的语法格式,多个父协议放在<>中,子协议继承父协议会得到父协议的所有方法。 协议的方法需要类去实现,如果类没有实现则会发出警告,但是我们有时定义的协议方法,类并不一定要去实现,OC为我们想到了这一点,通过@optional和@required两个关键词就可以做到。 @required:默认行为,实现类必须实现这些方法,如果没有实现,编译器会提示警告。 @optional:实现类可以实现这些方法,也可以不实现。
@protocol 协议名 <父协议1,父协议2...> //协议方法 @optional //可选的协议方法 //... @required //必须实现的协议方法 //... @end
实现协议:在类接口定义时需要指明继承的父类,在后面可以指定要实现的协议,实现协议的格式如下: @interface 类名 : 父类 <协议1,协议2...>
@end
下面看一个例子 定义一个协议(PrintProtocol.h [objc]  view plain  copy
  1. <span style="font-size:18px;">#import <Foundation/Foundation.h>  
  2. @protocol PrintProtocol  
  3. //协议方法  
  4. @optional  
  5. -(void)printName;  
  6. @required  
  7. -(void)printMessage;  
  8. @end  
  9. </span>  

定义一个Student类 实现协议PrintProtocol
[objc]  view plain  copy
  1. <span style="font-size:18px;">#import <Foundation/Foundation.h>  
  2. #import "PrintProtocol.h"  
  3. @interface Student : NSObject <PrintProtocol>  
  4. @property (nonatomic,copy)NSString* name;  
  5. @property (nonatomic,assign)int age;  
  6. @end  
  7.   
  8. #import "Student.h"  
  9. @implementation Student  
  10. -(void)printName{  
  11.     NSLog(@"我的名字是:%@",_name);  
  12. }  
  13.   
  14. -(void)printMessage{  
  15.     NSLog(@"姓名:%@,年龄%d",_name,_age);  
  16. }  
  17. @end</span>  

OC中的协议也可以想Java接口一样定义变量,定义变量的可以有以下2种语法: NSObject<协议1,协议2...>* 变量; id<协议1,协议2...> 变量;
下面我们测试协议的使用: [objc]  view plain  copy
  1. <span style="font-size:18px;">#import <Foundation/Foundation.h>  
  2. #import "Student.h"  
  3. int main(int argc, const charchar * argv[]) {  
  4.     @autoreleasepool {  
  5.         Student* stu = [[Student alloc]init];  
  6.         [stu setName:@"小明"];  
  7.         [stu setAge:10];  
  8.         //调用实现的协议的方法  
  9.         [stu printName];  
  10.         [stu printMessage];  
  11.          
  12.         //使用NSObject的方式创建一个协议对象  
  13.         NSObject<PrintProtocol>* op = stu;  
  14.         //使用协议对象调用协议方法  
  15.         [op printMessage];  
  16.         //使用id的方式创建一个协议对象  
  17.         id<PrintProtocol> ip = stu;  
  18.         //使用协议对象调用协议方法  
  19.         [ip printMessage];  
  20.     }  
  21. }</span>  

输出结果: 我的名字是:小明 姓名:小明,年龄10 姓名:小明,年龄10 姓名:小明,年龄10
网友评论