OC中的协议就是相当于Java中的接口,只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了
协议就是定义了一组方法,然后让其他类去实现
案例:
#import <Foundation/Foundation.h>
@protocol WithProtocol <NSObject>
//默认是必须实现的
//必须实现
@required
- (void)finshTask;
- (void)dontLate;
//可选实现
@optional
- (void)wearNeat;
@end
协议的定义格式:
@protocol 协议名 <父协议>
定义方法
@end
注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的
协议中定义的方法还有两个修饰符:
@required:这个表示这个方法是其他类必须实现的,也是默认的值
@optional:这个表示这个方法对于其他类实现是可选的
这个就和类似与Java中的抽象类了,如果是abstract修饰的就必须实现,所以如果一个协议中没有@optional修饰的方法,那么这个协议就相当于Java中的接口了。
这里要注意的是,上面的代码中NSObject不是我们之前说的NSObject类了,而是NSObject协议,他也是OC中第一个协议,这个名字相同在OC中是没有关系的。
再看一下协议的使用:
Student.h
#import <Foundation/Foundation.h>
#import "WithProtocol.h"
@interface Student : NSObject <WithProtocol>
- (void)study;
@end
使用协议很简单,
直接在继承类(NSObject)后面 <协议名>即可
#import "Student.h"
@implementation Student
- (void)study{
NSLog(@"study");
}
//直接在.m文件中实现即可,不需要在.h文件中再次定义
#pragma mark - WithProtocol
- (void)finshTask{
NSLog(@"完成任务");
}
- (void)dontLate{
//#warning 代码过几天在补充
NSLog(@"不迟到");
}
- (void)wearNeat{
NSLog(@"穿戴整洁");
}
@end
测试 类:
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *stu = [[Student alloc] init];
[stu finshTask];
[stu dontLate];
//判断wearNeat方法有没有在Student中实现了
if([stu respondsToSelector:@selector(wearNeat)]){// 类似Java 是用判断对象为空
[stu wearNeat];
}
}
return 0;
}
这里有一个方法 respondsToSelector:@selector ,这个方法的作用是判断当前对象中是否定义了一个方法,这个方法还是很有用的,如果在Java中,我们可能需要用反射去实现了。
总结
协议在OC中也是一个很重要的概念,Foundation框架中很多地方都用到了协议,其实和Java中的接口非常相似