美文网首页程序员
Swift链式调用的安全性

Swift链式调用的安全性

作者: 彩虹的洪 | 来源:发表于2018-01-25 10:36 被阅读0次

文中引用到的:
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是不能创建约束的,所以在编译时就提出了错误!

相关文章

  • Swift链式调用的安全性

    文中引用到的:SnapKitAlamofireBees 链式语法在开发很常见。iOS上的许多开源库都使用了链式语法...

  • Swift 链式调用

    说明 在js里面链式调用 大行其道。他可以给我们减少一些不必要的代码量,而且可以让代码开起来更美观。因此突发奇想的...

  • 像swift一样书写OC代码OC链式编程实践

    链式编程特点 链式编程 = 点语法 事物 串联 同样的hello word代码 OC和swift调用函数时候最大的...

  • iOS - Swift为UIButton扩展Block点击事件

    使用Swift为UIButton扩展Block点击事件,更快捷的完成UIButton事件调用及链式事件的调用 扩展...

  • swift 可选链式调用

    可选链式调用是指在当前值可能为ni的情况下,用当前值去获取它的属性、方法及其下标如果可选值有值,调用就会成功如果可...

  • Swift - 可选链式调用

    可选链式调用是一种可以在当前值可能为nil的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调用就会...

  • Swift之链式调用

    代码环境 Swift 3.0.2 macOS 10.12.2 Xcode Version 8.2 (8C38) 原...

  • Swift可选链式调用

    可选链式调用是一种可以在当前值可能为nil的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调用就会...

  • Swift:Alamofire的异步链式调用

    Alamofire是很常用的swift网络库,本文将分析Alamofire的链式调用。对Alamofire不是很熟...

  • swift重温笔记(可选链式调用)

    使用可选链式调用代替强制展开 为可选链式调用定义模型类 通过可选链式调用访问属性 通过可选链式调用调用方法 通过可...

网友评论

    本文标题:Swift链式调用的安全性

    本文链接:https://www.haomeiwen.com/subject/ztiwwxtx.html