当人们久别重逢时,常会对朋友的变化感到惊讶;而那些日复一日陪伴在我们身边的人,他们的变化往往容易被我们忽视。在这篇文章中,我将梳理从首个版本起那些给我留下深刻印象的 SwiftUI 关键更新及其影响。这不仅是对 SwiftUI 从诞生到逐渐成熟过程的回顾,也是一次对它所蕴含活力的新的认识。
每个 SwiftUI 的更新版本都带来了众多新功能和新特性。在本文中,我将主要讨论那些对我个人影响深远的变化,并探讨与 SwiftUI 以及苹果生态系统密切相关的其他框架和功能的演变,展示它们如何共同塑造了我们今天所使用的平台。
2019
在 SwiftUI 的首个版本中,尽管功能相对有限,但它所展示的一些核心特性——如视图的声明方式、响应机制和布局逻辑——沿用至今,而且在多个版本的迭代中几乎未经改变。这不仅证明了苹果在最初设计 SwiftUI 时的深思熟虑,也彰显了其理念和架构设计的前瞻性。
从框架的名称可以看出,SwiftUI 与 Swift 语言之间有着密不可分的联系,这种关系在随后的各版本更新中不断得到加强和印证。SwiftUI 充分利用了 Swift 语言的特性和优势,同时,Swift 语言的发展在某种程度上也得益于 SwiftUI 框架的推进。
与 SwiftUI 同时发布的还有 Combine 框架,它为异步数据流提供了强大的控制能力,SwiftUI 利用它实现了对引用类型的观察机制。Combine 使得苹果和第三方开发者能够方便地将现有的 API 转换为支持 SwiftUI 的响应式 API。然而,由于 Combine 无法提供高精度的观察能力,导致 SwiftUI 在某些场景下面临严重的性能问题,直到去年引入了 Observation 框架后该问题才得到改善。
WWDC 2019 上还推出了 Core Data with CloudKit,这一功能赋予了 Core Data 新生,为苹果生态的应用提供了一个强大而独特的优势。许多开发者选择 Core Data,很大程度上是被其便利且免费的数据同步功能所吸引。
尽管从今天的角度看,SwiftUI 的首个版本仍显稚嫩,但作为苹果推出的声明式、响应式框架,SwiftUI 已经充分展示了其独特性和潜力。
2020
- 新的项目模版:Xcode 为 SwiftUI 提供了全新的项目模版。通过使用
App
和Scene
协议,开发者现在可以更轻松地构建完整的应用入口。此外,此次更新还使得 SwiftUI 支持 macOS 开发,并引入了 iPad 上的多窗口模式。 - 众多的新惰性容器:此版本引入了
LazyVStack
、LazyHStack
、LazyVGrid
、LazyHGrid
等多种惰性容器。这些容器提供了更灵活的布局选项,并且它们是纯粹基于 SwiftUI 实现的原生惰性容器,与任何特定的 UIKit/AppKit 组件无关。遗憾的是,这些原生惰性容器直到现在还存在一些性能问题,许多开发者都期待开发团队能够尽快解决。 - @StateObject:
@StateObject
的引入解决了使用@ObservedObject
时遇到的引用类型实例生命周期不稳定的问题。 - onChange:
onChange
为开发者在视图中对特定状态变化执行逻辑的能力,与onAppear
和onDisappear
一起进一步强化了 SwiftUI 对声明式编程的独特理解。这包括将一些轻量级的命令式逻辑直接内联到基于函数的 UI 描述中。虽然这种设计理念带来的优缺点一直存在争议,但它也为 SwiftUI 提供了独特的优势。 - 滚动定位:
ScrollViewReader
提供了一种在滚动视图中通过id
和anchor
进行定位的方法,这一滚动实现充分体现了 SwiftUI 的布局哲学:基于视图标识、不依赖绝对位置。 - 小组件的引入:从 iOS 14 开始,苹果推出了 WidgetKit,这是一个专门用于构建小组件的框架。WidgetKit 要求开发者必须使用 SwiftUI 来构建这些小组件,这一变化显著推动了原本对 SwiftUI 保持观望态度的开发者们开始积极学习和采用 SwiftUI。
在 WWDC 2020 上,Core Data with CloudKit 新增了对公共数据库的同步功能,这进一步扩展了其在数据管理和多设备同步中的应用潜力。
WWDC 2020 后,SwiftUI 已经具备了构建一个完整应用的基本功能。在一些不太复杂的应用场景中,开发者几乎可以不必借助 UIViewRepresentable
来封装 UIKit 组件了。
2021
- 新的并发模型融合:随着 Swift 5.5 的推出,Swift 迎来了全新的并发模型。SwiftUI 通过
task
、task(id:)
和refreshable
关键字,为这些新并发代码提供了便捷的上下文,极大地简化了异步编程的复杂性。 - 基于视图层级的焦点管理:通过
@FocuseState
,SwiftUI 不仅补全了之前缺失的文本输入焦点管理功能,而且还将对焦点的管理提升到了全新的层级。现在,开发者可以在整个视图层级中统一地管理多个焦点的切换并感知焦点状态。这种统一的焦点管理功能给我留下了极为深刻的印象,因为它不仅仅实现了基本功能,更是提供了一种符合 SwiftUI 哲学的更优解决方案。 - FormatStyle 的集成:随着 Swift 的 Foundation 引入新的 Formatter API,SwiftUI 在
Text
和TextField
组件中提供了对这些格式化接口的支持。这使得开发者可以更方便地通过FormatStyle
控制文本的格式化输入和输出,极大地增强了组件的表现力以及代码的可读性和维护性。然而,目前在TextField
中使用FormatStyle
时,还存在一个限制:无法在用户输入时实时应用设置的格式化器。这是 SwiftUI 在未来版本中需要改进的一个问题。 - AttributedString 支持:SwiftUI 中引入
AttributedString
的支持显著增强了Text
组件在文本显示上的功能和灵活性。这一变化为开发者提供了更多样化的文本处理选项,大大丰富了用户界面的表现力。然而,尽管Text
的功能因此获得了显著提升,但自从引入AttributedString
以来,再未见其他类似规模的功能增强。更加遗憾的是,TextField
和TextEditor
直到目前仍未支持AttributedString
,这一限制减弱了这些控件在处理复杂文本格式时的能力和灵活性。 - 动态修改检索条件:在此次更新中,
@FetchRequest
新增了动态调整检索条件的能力,允许开发者无需创建额外的包装视图即可修改检索条件。然而,在 2023 年为 SwiftData 引入的@Query
属性包装器目前尚不具备此功能。
在 WWDC 2021 上,Core Data with CloudKit 新增了数据共享功能,至此,Core Data with CloudKit 的三大功能已经完全实现。
可以说,在 2021 年,SwiftUI 获得的众多功能增强与当年的 Swift 及 Swift Foundation 的更新密切相关。
2022
- Layout 协议:引入的
Layout
协议不仅赋予了开发者自定义布局容器的能力,而且深入展示了 SwiftUI 的基于协商的布局机制。通过这一协议,开发者对 SwiftUI 的布局逻辑有了更深刻的理解。新的Grid
组件以及VStack
、HStack
等原有布局组件的底层实现均符合Layout
协议,并支持AnyLayout
,显著增强了布局的灵活性。目前,Layout
协议尚不支持构建惰性容器,我们期待在未来的版本中看到这方面能力的扩展和完善。 - 全新的编程式导航:
NavigationStack
和NavigationSplitView
构成了全新的可编程导航机制,彻底改善了先前 SwiftUI 导航的限制。这一变革使得很多开发者将 SwiftUI 项目的最低系统要求设置为 iOS 16,以利用新的导航特性。 - Swift Charts:苹果推出的 SwiftUI 图表框架——Swift Charts,已经为业界在构建方式、视觉效果和与 SwiftUI 的整合方面设定了新的标准。在其第二年的更新中,该框架增加了更多图表类型和对交互的支持,进一步扩展了其功能。Swift Charts 现已成为苹果生态系统中图表应用的顶尖选择,其与 SwiftUI 的紧密结合不仅增强了 SwiftUI 本身的重要性,也显著提高了其实用性。
- 更好的 macOS 支持:此版本极大地增强了对 macOS 的支持,特别是在处理
WindowGroup
以及对Settings
和MenuBarExtra
的支持方面。从此版本开始,SwiftUI 在构建 macOS 应用方面的能力得到了实质性的提升。
2022 年的更新为 SwiftUI 带来了许多重大改进,特别是 Layout
协议和新的导航系统,它们对未来的 SwiftUI 应用开发具有深远的影响。
2023
- 全新的观察框架 Observation:随着 Swift 5.9 的发布,新引入的 Observation 框架提供了对可观察对象属性级别的观察能力,从根本上解决了因 Combine 观察精度不足所导致的 SwiftUI 视图无效更新过多的问题。全面采用 Observation 后,应用的效率将显著提高。此外,这次更新也简化了 SwiftUI 状态的声明和注入机制,在放弃 Combine 后,开发者可以仅通过
@State
和Environment
来管理各种状态。 - 革命性的动画和视觉效果升级:2023 年的更新为 SwiftUI 带来了一系列创新功能,包括动画完成回调、阶段性动画(Phase Animation)、关键帧动画,以及全新的 Transition 和 Shape 协议,和对 Shader 的支持。这些功能大幅提升了开发者在动画和视觉效果创作上的自由度。新引入的
animation
和visualEffect
修饰器通过使用闭包提供更清晰的逻辑处理,有效地减少了对视图树上下游组件的影响,为未来 SwiftUI 视图修饰器的发展指引了新方向。 - 可滚动容器功能的全面提升:可滚动容器也引入了许多新功能,例如滚动指示器设置、外边距调整、滚动裁切、不依赖
ScrollViewReader
的高级的滚动能力等。尽管这些单独的功能可能看起来并不突出,但它们的集中出现无疑让人遐想联翩:这是否为未来可能的惰性容器功能的大规模更新做了铺垫? - SwiftData:期待已久的 SwiftData 终于发布,作为 Core Data 的继任者,它的代码化建模方式和与 Observation 框架的紧密集成使其成为 SwiftUI 时代最合适的数据管理框架。若在即将到来的 WWDC 2024 中,SwiftData 仍未提供类似于
NSFetchedResultsController
的在视图外检索数据( 实时感知变化 )的功能,这将进一步证明苹果公司的战略决策——将 SwiftUI 定位为未来唯一的 UI 框架,并会在近期加快这个进程。 - visionOS:随着 Apple Vision Pro 的推出,它成为苹果生态中唯一一款原生应用开发仅支持 SwiftUI 的硬件平台。这一变化预示着 Apple Vision Pro 团队将会使用 SwiftUI 构建更多原生应用,这是广大开发者所期待的。苹果官方团队对 SwiftUI 的大规模采用,将会促进该框架的问题修复、性能优化和新功能的快速迭代。我期待在今年的 WWDC 2024 上看到更多 iOS 和 macOS 平台上使用 SwiftUI 开发的官方应用。
2023 年成为 SwiftUI 发展的关键年份,引入的 Observation 框架和 SwiftData 等创新技术,将帮助 SwiftUI 巩固其作为主流开发平台的地位。
展望 WWDC 2024
在 AI 成为主流趋势的年代,SwiftUI 将如何借助 AI 的强劲东风实现飞跃性的进步?在两周后举办的 WWDC 2024 上,我相信我们将见证更多激动人心的变革。
让我们共同期待 WWDC 2024 带来的惊喜!
下面的活动已经延期到 5 月 31 日了,环境大家积极参与!请在 此推文 下方回复你对 WWDC 2024 的期待。