OC学习日记013-协议

协议

这里写图片描述

前言

 我们之前讲过非正式协议(NSOject的类目),那么肯定还有正式协议。
 在OC中,一个类可以实现多个协议,通过协议可以弥补单继承的缺陷,但是协议跟继承不一样,协议只是一个方法列表,方法的实现得靠遵循该协议的类去完成。

概念

 协议:协议是一套标准,这个标准里面声明了很多方法,但是不关心具体这些方法是怎么实现的,具体的实现是由遵循这个协议的类去完成的

下面我们通过学生和外卖员这个例子来说明:

正式协议用 @protocol   来定义

在方法声明的时候,可以有两个关键字去限制是否让遵循该协议的类去实现该方法

@required :标注的方法为必须实现的方法(默认的)
@optional :标注的方法为可选实现的

(协议写在.h文件中的@interface上面或外置新建一个协议文件)

@protocol FoodProtocol <NSObject>
@required
-(void)sendFood:(BOOL)flag;
@optional
-(void)sayHello;
@end
@interface Student : NSObject
@property (nonatomic,assign)BOOL flag;
@property (nonatomic,assign)id<FoodProtocol>  delegate;
@end

在Student.m文件中中:

@implementation Student
-(void)setFlag:(BOOL)flag{
    _flag = flag;
    //conformsToProtocol: 确定了一个对象是否实现了某个协议
    //如果代理存在并且代理遵循了某个协议,就返回YES
    if (self.delegate &&[self.delegate conformsToProtocol:@protocol(FoodProtocol) ]) {
        [self.delegate sendFood:_flag];
    }
    else{
        NSLog(@"代理不存在");
    }
}
@end

在Waiter.h文件中,对协议FoodProtocol进行声明:

#import <Foundation/Foundation.h>
#import "Student.h"
@interface Waiter : NSObject<FoodProtocol>

@end

在Waiter.m文件中,实现协议中必须实现的方法:

#import "Waiter.h"
@implementation Waiter
-(void)sendFood:(BOOL)flag{
    if (flag) {
        NSLog(@"我给你送外卖");
    }
    else{
        NSLog(@"学生不忙,你自己过来拿");
    }
}
@end

其实学生送外卖这个例子,同时也是一个委托模式的例子,会在我们接下来的学习中学到。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值