//  WifeCondition.h

#import <Foundation/Foundation.h>

@protocol WifeCondition <NSObject>
// 会做饭
- (void)cooking;
// 会洗衣服
- (void)washing;
// 有一份好工作
- (void)job;
@end
//  Person.h

#import <Foundation/Foundation.h>
#import "Wife.h" @interface Person : NSObject // 媳妇
// 注意: 记住一点, 类型限定是写在数据类型的右边的,协议修饰成员变量
@property (nonatomic, strong) Wife<WifeCondition> *wife; - (void)show; @end
//  Person.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.h

#import <Foundation/Foundation.h>
#import "WifeCondition.h" @interface Wife : NSObject <WifeCondition> //协议就是写了接口的声明 @end
//  Wife.m

#import "Wife.h"

@implementation Wife
// 会做饭
- (void)cooking
{
NSLog(@"%s", __func__);
}
// 会洗衣服
- (void)washing
{
NSLog(@"%s", __func__);
}
// 有一份好工作
- (void)job
{
NSLog(@"%s", __func__);
}
@end
//
// main.m
// 协议的应用场景1-类型限定 #import <Foundation/Foundation.h>
#import "Person.h"
#import "Wife.h"
#import "WifeCondition.h" //导入.h文件,就是导包。 int main(int argc, const char * argv[]) { Person *p = [Person new];
// 1.协议的第一个应用场景, 可以将协议写在数据类型的右边, 明确的标注如果想给该变量赋值, 那么该对象必须遵守某个协议
// Wife<WifeCondition> *w = [Wife new]; Wife *w = [Wife new];
p.wife = w; [p show]; return ;
}

最新文章

  1. js取当前周几
  2. Android内存泄漏分享
  3. MongoDB基础入门002--基本操作,增删改查
  4. Cannot instantiate the type AppiumDriver
  5. 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)
  6. CentOS 7 修改时区(转)
  7. HDU 4614-Vases and Flowers(线段树区间更新)
  8. Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错GConf error
  9. SpringMVC强大的数据绑定
  10. android学习6——canvas的save,restore作用
  11. KeepAlived+Nginx实现高可用负载
  12. JS中的运算符 以及变量和输入输出
  13. struct stat结构体简介
  14. wss 协议传送过来的数据是经过 gzip 压缩过的,如何使用 qt 解压该数据呢?
  15. THUWC2019滚粗记
  16. Java框架spring Boot学习笔记(六):Spring Boot事务管理
  17. websocket 与 tornado 的结合
  18. vue 后退不刷新页面
  19. ARM 中必须明白的几个概念
  20. Cocos Studio is EOL&#39;d

热门文章

  1. Product Device Lot
  2. 使用WindowBuilder设计Swing程序
  3. Android开发笔记(5)——方法调用(基础)
  4. Count the consecutive zero bits (trailing) on the right with multiply and lookup
  5. TextOut与DrawText的区别
  6. Ajax——php基础知识(一)
  7. mvc 上传大文件
  8. Python 之有道翻译数据抓取
  9. Xilinx FPGA的专用时钟引脚及时钟资源相关
  10. shell使用eval进行赋值bc计算,bad substitution