- 不要等到明天,明天太遥远,今天就行动。
须读:看完该文章你能做什么?
给某个类的对象让它遵循协议
学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)
什么是协议
一、本章笔记
/*
1.协议的第一个场景, 可以将协议 写在数据类型的右边.明确的标注 如果想给该变量赋值,那么该对象 必须遵守某个协议
2.让一个对象遵守某个协议
@property (nonatomic,strong) Wife<WifeCondition> *wife;
3.虽然在接收某一个对象的时候,对这个对象进行类型限定(限定它必须实现某个协议),但是并不意味着这个对象 就真正的实现了该方法,所以每次在调用对象的协议方法时应该进行一次验证
使用 respondsToSelector 进行一个方法的判断
*/
二、code
main.m
#pragma mark 03-协议应用场景1-类型限定
#pragma mark - 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#import "Person.h"
#import "Wife.h"
#import "WifeCondition.h"
#pragma mark - main函数
int main(int argc, const char * argv[])
{
Person *p = [[Person alloc]init];
// Wife<WifeCondition> *w = [[Wife alloc]init];
Wife *w = [Wife new];
p.wife = w;
[p show];
return 0;
}
Person
>>>.h
#import <Foundation/Foundation.h>
#import "Wife.h"
@interface Person : NSObject
// 注意 : 记住一点,类型限定 就是写在数据类型的右边
@property (nonatomic,strong) Wife<WifeCondition> *wife;
- (void)show;
@end
>>>.m
#import "Person.h"
@implementation Person
- (void)show
{
// 注意: 虽然在接收某一个对象的时候,对这个对象进行类型限定(限定它必须实现某个协议),但是并不意味着这个对象 就真正的实现了该方法,所以每次在调用对象的协议方法时应该进行一次验证
//
if ([self.wife respondsToSelector:@selector(cooking)])
{
[self.wife cooking];
}
if ([self.wife respondsToSelector:@selector(washing)])
{
[self.wife washing];
}
if ([self.wife respondsToSelector:@selector(job)])
{
[self.wife job];
}
}
@end
######Wife
```objc
>>>.h
#import <Foundation/Foundation.h>
#import "WifeCondition.h"
@interface Wife : NSObject <WifeCondition>
@end
>>>.m
#import "Wife.h"
@implementation Wife
// 会做饭
- (void)cooking
{
NSLog(@"%s",__func__);
}
// 会洗衣服
- (void)washing
{
NSLog(@"%s",__func__);
}
// 工作
- (void)job
{
NSLog(@"%s",__func__);
}
@end
######WifeCondition
```objc
>>>.h
#import <Foundation/Foundation.h>
@protocol WifeCondition <NSObject>
// 会做饭
- (void)cooking;
// 会洗衣服
- (void)washing;
// 工作
- (void)job;
@end
网友评论