前言
今天我们来学习一下 Swift 实践方面的一个技巧,那就是链式编程。链式代码在 Swift 中有着比 Objective-C 天然的优势,而且通过 Swift 语言本身强大的特性,只需要很少的代码就可以让自己的 Swift 工程具有编写链式 UI 代码的能力。
什么是链式编程
本质上链式编程就是调用一个方法的时候,这个方法的返回值是这个类的指针,然后可以再对这个指针进行下一步操作。于是在代码上就会呈现一种链条式的方法调用,就是所谓的链式编程。在C++和Java中会被较多使用。
为什么选择链式编程
链式编程让代码有更清晰有逻辑的结构,大大提高了代码可读性。我们今天就是主要讲一下swift项目中UI代码如何实现链式编程。
实现思路分析
先来分析一下 UI 布局代码的结构。翻出一段使用代码完成的 UI 布局代码看一看,你会发现其中的一些特定的结构。
第一步肯定是会初始化一个 view,接下来通过一系列步骤完成需求:添加到父 view、添加视图约束、配置属性。
除了初始化 view 这个步骤,将其后的三个步骤抽取出来,做成三个通用的链式布局函数,将这三个函数使用 extension 机制扩展到 UIView
中。那么在controller中创建view时就可以使用链式代码实现view的布局了。具体extension中的实现代码如下:
import UIKit import SnapKit protocol ViewChainable {} extension ViewChainable where Self: UIView { @discardableResult func config(_ config: (Self) -> Void) -> Self { config(self) return self } } extension UIView: ViewChainable { func adhere(toSuperView: UIView) -> Self { toSuperView.addSubview(self) return self } @discardableResult func layout(snapKitMaker: (ConstraintMaker) -> Void) -> Self { self.snp.makeConstraints { (make) in snapKitMaker(make) } return self } }
以上就是完成链式 UI 布局的所有代码。这里布局第三方库我使用的是SnpKit,如果你使用的是其他库(比如PureLayout、SDAutoLayout)则自己稍加修改下即可。实现思路也很好理解,比较难理解的是 config 函数的实现,可以看到这里定义了一个名为 ViewChainable 的协议,然后对这个协议做了一个扩展,并让 UIView 实现了这个协议。这么做的原因在于,为了让 config 函数的闭包参数在实际使用中,闭包的第一个参数类型可以具体到 UIView 的不同子类上。拿上面的例子来说,UILabel 的实例在调用 config 函数时,所需的闭包参数类型就是 (UILabel) -> Void
而不是 (UIView) -> Void
。
用法举例
来个样例说明用法,比如,我们要在一个 view 中添加一个 label,这个 label 水平居中,它的 top 与父 view 的 top 相距 80。代码如下:
let label = UILabel() .adhere(toSuperView: view) .layout { (make) in make.top.equalToSuperview().offset(80) make.centerX.equalToSuperview() } .config { (label) in label.backgroundColor = UIColor.clear label.font = UIFont.systemFont(ofSize: 20) label.textColor = UIColor.darkGray label.text = "Label" }
那么这段样例代码有什么好处呢?首先,从这段代码中,可以明显看到 UI 布局的步骤,而且添加约束和配置 view 的具体逻辑代码,被不同的 Closure 封装起来。代码的结构要比之前更清晰。
进阶
如果你对响应式编程感兴趣,你会发现 RxSwift 这个框架和上面的链式布局代码简直是绝配。RxSwift 这个库本身也是支持很多链式调用的。关于 RxSwift,这又是另外一个大坑了,自己有兴趣的可以去学习一下。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/swiftbc/1032.html