Swift链式调用的安全性

文中引用到的:
SnapKit
Alamofire
Bees

链式语法在开发很常见。iOS上的许多开源库都使用了链式语法。比如说SnapKitAlamofire等。


像以上SnapKit的这种情况,链式调用为了灵活的添加各种约束属性。每次调用后都是返回ConstraintMakerExtendable的实例。
但是这样就产生了一个问题:没有办法在编译时期检查被连起来的成员结构!!

像以上的情况实际上是不能产生正确的约束,但是在编译期间编译器没有办法给出提示,因为并没有语法错误。
那么如解决这个问题呢?
在Swift上可以利用泛型协议拓展

举个例子

比如动物之间只有同样的种类才可以互相喜欢。那先定义一个函数表示喜欢这个行为。

在定义两个不同的动物类

好,我们来试一下

嗯,看起来是正常工作了。Dog和Dog可以like,Dog和Cat不可以!因为like函数里的left与right两个参数类型必须要相同。不同的话,编译器就会提示错误了!

但是好像哪里不对啊!这和链式调用有个屁关系啊!
别着急。

为了达成一开始的目标。我们先定义一个协议。

然后修改下like函数。

T必须为Animal类型,这样可以使like可以使用声明在Animal协议中的方法属性等。。。
然后拓展Animal协议

当然这个时候Dog类和Cat类都要遵循Animal协议

来试一下

嗯!链式调用可以用了。

但是不对啊

这样子也可以!前面的两个是不对的cat和dog是不能like。但是编译时也没有报错。因为只要链式最后的那个对象类型相同就可以了!并没有解决问题啊!
其实我们已经快要完成了只要给动物类加个泛型用来记录左边已经链起来的类型就可以了!

这就是最后的版本了!
试一下正确的情况

错误的情况

不管链的多长,只要连起来的所有对象中有一对类型不匹配,就不能通过编译!
但是以上的例子中只保留了链起来的最后一个对象!实际的应用中,应该是要保留连起来的所有对象的。不然就没有意义了。

说了这么多!有什么实际的意义呢?
回到开头的SnapKit,使用链式调用创建约束时,就可以使用以上的方法来降低程序的错误率。因为错误的写法不能通过编译啊!虽然减少了一点点灵活性,但是安全性提高很多。

我在自己的自动布局库里就用了这种方法:点这里Bees

Bees

top和left是不能创建约束的,所以在编译时就提出了错误!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 10,101评论 0 12
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,660评论 4 61
  • 前不久网上一直在流传一个视频,我只看了开头,就没再敢往下看。一个鲜活的生命流逝,肇事者逍遥法外,他们都是年轻人,...
    茉妧阅读 1,522评论 0 0
  • 问题: 数组方法里push、pop、shift、unshift、join、split分别是什么作用? push用...
    爱上帘外修竹阅读 2,976评论 0 0
  • 在光阴里,找个人真难! 结束是把开始的售出! 这个世界,一不小心就会碰见或禽或兽 要比绣在帽子或衣服上动态万千 用...
    王居明阅读 2,629评论 2 3

友情链接更多精彩内容