Hello, SwiftUI
Apple 在 WWDC19 上正式发布了 Project Catalyst(原 Marzipan),使得开发者能够将 iPadOS app 移植到 macOS 上。同时 SwiftUI 也压轴亮相,正式统一了 Apple 全平台的 UI 开发解决方案。恰逢前些时候,Google 在其 I/O 大会上亮相了 Jetpack Compose —— 一个全新的 Android 原生 UI 开发框架,标志着两大移动操作系统阵营全面拥抱声明式 UI 开发模式。
声明式 UI 的前世今生
其实声明式 UI 并不是什么新技术,早在 2006 年,微软就已经发布了其新一代界面开发框架 WPF,其采用了 XAML 标记语言,支持双向数据绑定、可复用模板等特性。
2010 年,由诺基亚领导的 Qt 团队也正式发布了其下一代界面解决方案 Qt Quick,同样也是声明式,甚至 Qt Quick 起初的名字就是 Qt Declarative。QML 语言同样支持数据绑定、模块化等特性,此外还支持内置 JavaScript,开发者只用 QML 就可以开发出简单的带交互的原型应用。
声明式 UI 框架近年来飞速发展,并且被 Web 开发带向高潮。React 更是为声明式 UI 奠定了坚实基础并一直引领其未来的发展。随后 Flutter 的发布也将声明式 UI 的思想成功带到移动端开发领域...
声明式到底是什么
想象我们要实现下面这个界面:
打开开关就让下面的 label 显示 on,反之显示 off。如果我们要用非声明式的方式实现,即命令式,那么需要:
1. 创建一个 `UISwitch`,设置它的 change 事件 handler
2. 创建一个 `UILabel`
3. 创建一个 `UIStackView`,设置方向为垂直
4. 将 1、2 创建的两个视图添加到 `UIStackView` 中
5. change 事件触发时读取开关的当前状态,设置相应字符串到 label 中
这样做面对一个状态,我们尚且能够正确处理,但随着应用日渐复杂,状态也越来越多并且错综复杂,状态变化的顺序甚至也能影响应用逻辑的正确性,因为我们对每个事件的处理都是对界面的增量修改。一旦前一个状态有错误,后面就会错上加错,接下来多线程混入,然后 boom,你的应用可能就 crash 了。
声明式的意思就是让我们描述我们需要一个什么样的界面,而