赵龙,2020年加入Qunar,担任大前端iOS开发,OC、 SWIFT、
C++、Dart等技能丰富,喜欢优化开发流程,研究增加效率的代码和开发方式。
林书辉,2018年加入Qunar,iOS、RN开发工程师。目前负责大客户端公共产品首页、用户中心等功能的开发和维护。持续关注学习前沿的大前端技术,推崇技术创新带来的效率优化和性能提升。现致力于Native+DSL动态化组件方案的开发与推广。
一. 前言
SwiftUI 出现已经2年,至今尚未大规模推广落地,它局限在 iOS 生态内,暂时闭源的 UI 库,需要 iOS13 版本来适配,这些因素阻碍了更多人使用,但是其实它相对于其他UI框架具有非常高的开发效率与运行效率,相对于 Objective-C+UIKit 更是一个全面的框架升级。
写这篇文章是为了让大家熟悉 SwiftUI ,让客户端同学在技术选型的时候有切实的数据和特性来参考,也希望推进大客户端的 Swift 基础设施建设。
二. SwiftUI代码库
iOS 中 SwiftUI 由2个底层框架驱动 SwiftUI.framework 与 Combine.framework
其中 SwiftUI.framework 负责界面搭建,简洁的 DSL 相比 OC 让开发效率提升不少,例如我们要实现在屏幕中心实现一个带文本按钮, OC 中我们一般这样写:
- (void)viewDidLoad {
CGRect screen = [[UIScreen mainScreen] bounds];
UIButton * centerBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[centerBtn setFrame:CGRectMake(screen.size.width / 2 - 30, screen.size.height / 2 - 15, 60, 30)];
[centerBtn setTitle:@"测试按钮" forState:UIControlStateNormal];
[self.view addSubview:centerBtn];
}
而在 SwiftUI 中我们这样写:
var body: some View {
Button(){
Text("测试按钮")
.frame(width: 60, height: 30, alignment: .center)
}
}
Combine.framework 负责生成数据流绑定操作与界面,基于观察者模式,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
只不过,这些框架对这个模式进行了一点扩充,在被观察者与观察者之间引入了可选的转换操作(操作符:Operators)。
三. 渲染流程
以我们去哪儿小组件一个页面左下角文本的渲染为例。