从 2016 年的一个视频再谈 SwiftUI 的理念、现状与未来

今天看了一个 2016 年的 WWDC 视频,即 WWDC16 Session 419 之《Protocol and Value Oriented Programming in UIKit Apps》。如果你写过 SwiftUI,那么一定会觉得这个标题就是在讲它,毕竟 SwiftUI 就是基于 Protocol 和 Value 的图形编程。

看过这个视频后,可以联想到 Apple 在准备 WWDC16 的前后,就已经开始着手准备打造 SwiftUI 这个下一代图形编程了,尽管它要在 2019 年才会正式宣布 1.0。确实在 2019 年 6 月 4 日的时候,来自 Swift 核心小组的开发者 Joe Groff 也曾这样透露过:

Combine goes back before even Swift existed. I’ve been helping the SwiftUI folks for at least three years, and they were probably working on stuff before I knew about it

所以,把这个视频理解为 SwiftUI 的一个思想起源(或者是阶段性成果)是没有问题的。

那么这个视频讲了些什么呢?简单的说,就是引出了「Local reasoning(局部推理)」这个概念,强调要多用 Value Types 来避免 UI 编程中常见的问题。另外一个就是要多用 Composition(组合),而不是 Inheritance(继承),核心理念就是:Easier to understand, easier to test。

这个视频也通过一个很实用的例子来讲述这个理念,即以 Swift 的 Generic + Protocol 扩展出了一个 Cell Layout 的 Protocol,解决了 UIKit 和 SpriteKit 的共有逻辑的排版场景,尽管是不同的 UI 框架,但用一样的 Protocol 去解决,保证了尽可能少的代码和一样的结果。特别是当我看到示例中,用了「Child : Layout」这样的约束时,觉得太眼熟了,这不就是 SwiftUI 里无处不在的「Content: View」吗?

这个例子其实就是非常典型的 SwiftUI 正在解决的问题:iOS、macOS、watchOS 等,每个平台都是用不同的 UI 框架,有平台特殊的部分,但也有所有平台的共同点:SwiftUI 正是要去抽象这些共同点,让写 UI 变得轻松,同时提供 fallback 到平台 Native 的解决方案。

这当然是理想的状态。

2019 年诞生的 SwiftUI 1.0,到今年 2021 的 SwiftUI 3.0,已经开启第三年了。从我过去两年自己的实践加上观察开发者社区的反馈来看,可以说 SwiftUI 依然没能达到足够成熟和稳定,特别是在 macOS 上。毕竟 Apple 的重心一直在 iOS 上。

另一方面,它也确实变得越来越完善,我曾经给 Apple 报告过不少 SwiftUI 的 Bug,比如今年 4 月份报告过一个在macOS 上的 Bug,后来 10 月的时候收到 Apple 邮件说修复了。这对我来说是一个比较积极的信号,会鼓励我继续报 Bug。同时我会继续在项目中采用 SwiftUI,看着它不断完善。

Apple Fixed SwiftUI Bugs.jpeg

目前我在所有用了 SwiftUI 的项目里,均采用的是 UIKit/AppKit 为骨架,SwiftUI 去实现部分 UI 的模式(即 Hosting)。这种我称之为「保守积极型」的模式,在 SwiftUI 无法达到预期的情况下,始终可以 fallback 到 UIKit/AppKit 去实现,可以说兼顾了开发的效率和稳定。

开启第三年的 SwiftUI 3.0,有不少新东西,我还没有来得及去玩,但已经可以感觉到这是一个非常可用的版本了,特别是看到 FocusState 这个东西的引入,完美解决了之前的版本没办法控制 FirstResponder 的问题。这个对交互细节的控制是极其重要且不可或缺的,这就是为何我说 SwiftUI 3.0 是一个非常可用的版本。当然,最终是否可用,还得靠实践去得出结论。

最后,对于广大开发者来说,最大的问题还是:iOS 15 + macOS 12。特别是今年 iOS 15 的适配速度不及去年 iOS 14,目前仍有 iOS 15 特性在跳票中,macOS 12 也尚未正式发布。总之,一切还需要时间。

读到这里的你,是否也有自己的关于 SwiftUI 的经历和体验要分享呢?欢迎留言交流。

欢迎使用图拉鼎和他的团队开发的作品

Moment - 每一天都值得期待!

设计精美、使用方便的倒数日, 纪念日, 时间进度条, 年龄工具。

No Comment

Leave a Comment