pragma mark 协议应用场景1-类型限定
pragma mark 概念
pragma mark 代码
###import <Foundation/Foundation.h>
#pragma mark 类
#import "Person.h" // 人
#import "Wife.h" // 妻子
#import "WifeCondtion.h" // 协议
#pragma mark main函数
int main(int argc, const char * argv[])
{
// 某个工程师 希望找个会做饭、洗衣服的女朋友。有工作优先
// 满足条件的女生可以发消息
// 会做饭 \
会洗衣服 \
有份好工作 \
#pragma mark code
Person *p = [Person new];
#warning 协议的应用场景 找妻子要3个要素: 会做饭、洗衣服、有工作
// 1.协议的第一个应用场景,可以将协议写在数据类型的右边
// 明确的标注 如果想给该变量赋值,那么该对象必须遵守某个协议
Wife<WifeCondtion> *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<WifeCondtion> *wife; // 人的妻子 必须会做饭、洗衣服、有工作
- (void)show;
@end
Person.m
#import "Person.h"
#import "WifeCondtion.h"
@implementation Person
- (void)show
{
// 注意: 虽然在接受一个对象的时候,对这个对象进行了类型限定(限定它必须实现某个协议),
//但是并不意味着这个对象是 就真正的实现了该方法, 所以每次在调用对象的协议方法是应该进行一次验证
// 通过 respondsToSelector 会去查找这个方法有没有实现了 如果会返回一个BOOL值
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 "WifeCondtion.h"
@interface Wife : NSObject <WifeCondtion>
@end
Wife.m
#import "Wife.h"
@implementation Wife
// 会做饭
- (void)cooking
{
NSLog(@"%s",__func__);
}
// 会洗衣服
- (void)washing;
{
NSLog(@"%s",__func__);
}
// 有工作
- (void)job
{
NSLog(@"%s",__func__);
}
@end
WifeCondtion.h //妻子协议
#import <Foundation/Foundation.h>
@protocol WifeCondtion <NSObject>
// 会做饭
- (void)cooking;
// 会洗衣服
- (void)washing;
// 有工作
- (void)job;
@end