内容简介:很多第三方框架中,有这样的一种用法:有一个.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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
High Performance Python
Micha Gorelick、Ian Ozsvald / O'Reilly Media / 2014-9-10 / USD 39.99
If you're an experienced Python programmer, High Performance Python will guide you through the various routes of code optimization. You'll learn how to use smarter algorithms and leverage peripheral t......一起来看看 《High Performance Python》 这本书的介绍吧!