内容简介:很多第三方框架中,有这样的一种用法:有一个.h的头文件,它里面只有协议的声明,而且没有对应的.m实现文件。通常这种文件就用来专职声明协议的作用了。这个框架里面有这样一段代码:
很多第三方框架中,有这样的一种用法:有一个.h的头文件,它里面只有协议的声明,而且没有对应的.m实现文件。通常这种文件就用来专职声明协议的作用了。
这里举一个大家都能看到和下载的例子,优秀的第三方图文混排框架: TYAttributedLabel 。
这个框架里面有这样一段代码:
// 添加响应点击rect - (void)addRunRectDictionary:(NSDictionary *)runRectDictionary { if (runRectDictionary.count < _runRectDictionary.count) { NSMutableArray *drawStorageArray = [[_runRectDictionary allValues]mutableCopy]; // 剔除已经画出来的 [drawStorageArray removeObjectsInArray:[runRectDictionary allValues]]; // 遍历不会画出来的 for (id <tytextstorageprotocol> drawStorage in drawStorageArray) { if ([drawStorage conformsToProtocol:@protocol(TYViewStorageProtocol)]) { [(id <tyviewstorageprotocol> )drawStorage didNotDrawRun]; } } } _runRectDictionary = runRectDictionary; } </tyviewstorageprotocol> </tytextstorageprotocol>
1.如何判断某对象是否服从指定协议
可以先关注这个:
if ([drawStorage conformsToProtocol:@protocol(TYViewStorageProtocol)])
这行代码主要做一个是否服从协议的判断。这个协议是声明在TYTextStorageProtocol.h文件里面的。大家查看这个文件可知,它里面主要声明了几个协议,而且没有对应的.m文件。
打开TYTextStorageProtocol.h查看协议的代码:
@protocol TYViewStorageProtocol <nsobject> /** * 设置所属的view */ - (void)setOwnerView:(UIView *)ownerView; /** * 不会把你绘画出来 */ - (void)didNotDrawRun; @end </nsobject>
2. 如何将未知类型的id对象转换成一个服从指定协议的对象
-
接下来关注这个:
[(id <tyviewstorageprotocol> )drawStorage didNotDrawRun]; </tyviewstorageprotocol>
这句话里面的didNotDrawRun方法是前面那个协议声明的方法,所以,只有当前面做了判断是否服从该协议之后,才可将暂时还是个id类型的drawStorage对象进行转换,转成一个服从该协议的对象,进而执行协议方法。
对象的转换:
(id <tyviewstorageprotocol> )drawStorage </tyviewstorageprotocol>
3.如何使对象服从指定协议
至于一个对象是否“服从”的标准:就是该对象的类或其父类的@interface后面跟上一个协议,并实现协议的方法。
接下来再这里的drawStorage对象,是怎样选择“服从” 协议TYViewStorageProtocol的:
-
TYViewStorage.h
#import "TYDrawStorage.h" @interface TYViewStorage : TYDrawStorage <tyviewstorageprotocol> @property (nonatomic, strong) UIView *view; // 添加view @end </tyviewstorageprotocol>
-
TYViewStorage.m
//TYViewStorageProtocol - (void)didNotDrawRun { [_view removeFromSuperview]; }
拓展阅读:
区分class_conformsToProtocol与conformsToProtocol
https://blog.csdn.net/likendsl/article/details/7567719
作者:陈满iOS
链接:https://www.jianshu.com/p/ec124372be05
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。