OC中的协议:一组方法声明的列表,协议中不需要实现这些方法,谁遵守这个协议,谁就需要实现协议中的方法。协议创建的步骤:
- 制定协议内容(方法声明列表)
- 遵守协议(.h)
- 实现协议中方法(.m)
- 调用协议中的方法
在OC中完整的创建一个协议:
一、例子:有一个漂亮的妹子要征婚,对另一半的要求:
- 高
- 富
- 帅
- 会写代码
妹子对另一半的要求实际上就是协议。
- 制定协议的一方:妹子
- 遵守协议的一方:想和妹子结婚的男人
- 协议的内容:(也即要求)
- 1、高
- 2、富
- 3、帅
- 4、会写代码
二、以上面女方相亲为例创建一个协议
分析:OC中的协议一定会有创建和遵守!
协议的创建和遵守:
1. 创建协议:协议中声明相关的方法 ———> 女方对另一半提出的要求。
2. 遵守协议:实现协议中的相关方法 ———> 男方需要达到女方的相关要求。
- 制定协议,创建一个
ProtocolToMan.h
文件
#import <Foundation/Foundation.h>
// 说明:
// @protocol: 声明协议的关键字
// ProtocolToMan: 协议名
// <NSObject>: 基协议,OC中所有的协议都遵守这个基协议
@protocol ProtocolToMan <NSObject> //声明的一个协议,协议名为ProtocolToMan,协议遵守基协议
// 协议的内容就是要求
@required
- (void)height; // 高
@required
- (void)money; // 富
@required
- (void)smart; // 帅
@optional
- (void)writeCode; // 会写代码
@end
- Man类
// Man.h
#import <Foundation/Foundation.h>
#import "ProtocolToMan.h" // .h:遵守协议
@interface Man : NSObject <ProtocolToMan> // 类声明的后面<协议名>表示该类遵守这个协议
@end
// Man.m
#import "Man.h"
@implementation Man
// .m:实现协议中的方法
// 实现协议中的方法,达到要求
- (void)height {
NSLog(@"I am so height..............");
}
- (void)money {
NSLog(@"I have so much money........");
}
- (void)smart {
NSLog(@"I am so smart...............");
}
- (void)writeCode {
NSLog(@"write hello world...........");
}
@end
- 协议的使用
Man *qianfu = [[Man alloc] init]; // 实例化一个man对象
// 思考:来了一个高富帅来征婚,但是这个高富帅偏偏不会写代码,骗这个妹子他什么都会,
// 妹子很单纯,相信了。妹子有一天心血来潮,让这个高富帅写一个hello world程序,
// 高富帅瞬间露馅了,代码瞬间崩溃了,高富帅崩溃,妹子也崩溃了,妹子很伤心,
// 妹子做了一个决定了:当再有人征婚,先进行判断,判断男人是否真的满足要求。
// 调用协议中方法
// [qianfu height];
// [qianfu money];
// [qianfu smart];
// [qianfu writeCode];
if ([qianfu respondsToSelector:@selector(height)]) {
[qianfu height];
}
if ([qianfu respondsToSelector:@selector(money)]) {
[qianfu money];
}
if ([qianfu respondsToSelector:@selector(smart)]) {
[qianfu smart];
}
if ([qianfu respondsToSelector:@selector(writeCode)]) {
[qianfu writeCode];
}
- 声明协议时的关键字
再思考: 想遵守协议,必须要能够满足所有要求,实现所有方法,但是现实很残酷,女方的要求虽然提出来了,但是目前为止没有一个男的达到要求。一年过去了,两年过去了,三年过去了…,女孩他妈着急了,和女孩商量了一下,对白如下:
母亲:娃,要不咱们把要求降一降吧,眼瞅着你这干提要求也嫁不出去,家里粮食也快不够吃了!
娃:好吧,那么高富帅必须一定要达到要求,至于会不会写代码,那就算了,能写最好,不能写就算了!
那么这时候就可以在协议中声明方法时加上相应的关键字即可。声明协议方法时的关键字:
@required
:表示必须实现的方法,默认;
@optional
:表示可以实现,也可以不实现的方法;
尝试将Man.m
中@implementation
里的height
方法相关内容注释掉,Xcode会产生:Method ‘height’in protocol not implemented
警告,即height
方法没有实现。
如果将height
、money
、smart
、writeCode
方法都注释掉,会产生三条警告。因此,如果我们在协议声明里什么都不写默认是required
,也就是必须要实现的。