Swift使用SnapKit模仿Kingfisher第三方扩展优化.docxVIP

Swift使用SnapKit模仿Kingfisher第三方扩展优化.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

Swift使用SnapKit模仿Kingfisher第三方扩展优化

目录正文SnapKit扩展方式简要思考Kingfisher扩展方式简要思考自行模仿尝试最后

正文

我们平时用swift写第三方扩展(OC中的分类)时,可能会直接就往扩展里面写方法,简单又方便,然而当我们看一些常用你的三方(例如:Kingfisher、SnapKit)等,都会用一个简单的参数引出(例如:kf、snp),下面来探索一下怎么用的,然后在总结其优缺点

SnapKit扩展方式简要思考

以SnapKit为例,使用如下,发现引入了snp

variv=UIImageView();

iv.snp.makeConstraints{makein

中间变量snp如下所示,ConstraintView是统一不同平台的重命名(别名)

publicextensionConstraintView{

varsnp:ConstraintViewDSL{

returnConstraintViewDSL(view:self)

其以前版本也是直接将left等加上前缀snp_,直接调用,而加入前缀我想大家一眼就看出来目的了,没错避免与其他扩展重名,现在也已经改成了引入snp的方式,来间接调用,实际逻辑都通过snp来调用,个人猜测也是借鉴了主流的应用来更新的,调用时,至少分类API整洁了

优缺点:

1、引入中间变量snp之后,首先感觉到的就是,我们的分类在调用的时候,明显没有那么多杂乱的方法了(这种方式OC其实也可以借鉴)2、另外也可以取消了前缀,减少了代码量,并且当与其他类出现重名的时候,只需要替换snp的变量名字即可,不需要替换全部方法,减少了命名阻碍3、不同三方之间通过引入该参数,让我们的调用模块标识更明显,功能模块也更清晰,可维护性更强

Kingfisher扩展方式简要思考

以Kingfisher为例,使用如下,发现引入了kf

variv=UIImageView();

iv.kf.setImage(with:URL(string:))

另外其在使用过程中,通过充分利用swift特性,比SnapKit使用上更优雅高效一些

//声明一个基础协议,必须为AnyObject类型,可用于后续给基础类添加协议

publicprotocolKingfisherCompatible:AnyObject{}

//扩展实现该基础协议,以便于方便让我们的组件能够直接通过.kf直接调用里面的方法

//此kf和snap类似,只不过添加了一个泛型,用于不同类之间进行扩展限制

extensionKingfisherCompatible{

publicvarkf:KingfisherWrapperSelf{

get{returnKingfisherWrapper(self)}

set{}

//通过泛型顶一个一个基础类,通过该基础类可以获取我们被扩展的组件

//且通过该基础类的泛型,可以分别给不同类型添加不同扩展方法

publicstructKingfisherWrapperBase{

publicletbase:Base

publicinit(_base:Base){

self.base=base

//当遵循协议的类为UIImage的时候,为其扩展方法

extensionKingfisherWrapperwhereBase:KFCrossPlatformImage{

//当遵循协议的类为KFCrossPlatformImageView的时候,为其扩展方法

extensionKingfisherWrapperwhereBase:KFCrossPlatformImageView{

//上面仅仅是定义了一个扩展后可以使用的协议,并未应用到我们的基础组件中

//因此只需要给基础组件添加扩展,遵循我们的协议即可

extensionKFCrossPlatformImageView:KingfisherCompatible{}

没见到名字的View是为了不同平台统一名字起的别名,如下所示(打消疑虑专用)

#ifos(iOS)||os(tvOS)

publictypealiasConstraintView=UIView

#else

publictypealiasConstraintView=NSView

#endif

优缺点:

1、引入中间变量

文档评论(0)

187****0335 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档