OC中协议的讲解

OC中的协议:一组方法声明的列表,协议中不需要实现这些方法,谁遵守这个协议,谁就需要实现协议中的方法。协议创建的步骤:

  1. 制定协议内容(方法声明列表)
  2. 遵守协议(.h)
  3. 实现协议中方法(.m)
  4. 调用协议中的方法

在OC中完整的创建一个协议:

一、例子:有一个漂亮的妹子要征婚,对另一半的要求:

  • 会写代码

妹子对另一半的要求实际上就是协议。

  • 制定协议的一方:妹子
  • 遵守协议的一方:想和妹子结婚的男人
  • 协议的内容:(也即要求)
    • 1、高
    • 2、富
    • 3、帅
    • 4、会写代码

二、以上面女方相亲为例创建一个协议
分析:OC中的协议一定会有创建和遵守!
协议的创建和遵守:
1. 创建协议:协议中声明相关的方法 ———> 女方对另一半提出的要求。
2. 遵守协议:实现协议中的相关方法 ———> 男方需要达到女方的相关要求。

  1. 制定协议,创建一个 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
  1. 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
  1. 协议的使用
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];
    }
  1. 声明协议时的关键字
    再思考: 想遵守协议,必须要能够满足所有要求,实现所有方法,但是现实很残酷,女方的要求虽然提出来了,但是目前为止没有一个男的达到要求。一年过去了,两年过去了,三年过去了…,女孩他妈着急了,和女孩商量了一下,对白如下:

    母亲:娃,要不咱们把要求降一降吧,眼瞅着你这干提要求也嫁不出去,家里粮食也快不够吃了!

    娃:好吧,那么高富帅必须一定要达到要求,至于会不会写代码,那就算了,能写最好,不能写就算了!

    那么这时候就可以在协议中声明方法时加上相应的关键字即可。声明协议方法时的关键字:
    @required:表示必须实现的方法,默认;
    @optional:表示可以实现,也可以不实现的方法;

    尝试将Man.m@implementation里的 height方法相关内容注释掉,Xcode会产生:Method ‘height’in protocol not implemented警告,即 height方法没有实现。

    如果将heightmoneysmartwriteCode方法都注释掉,会产生三条警告。因此,如果我们在协议声明里什么都不写默认是required,也就是必须要实现的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值