WWDC 2021 转眼间已经结束一周了。本次 WWDC 苹果一如既往的带来了新的操作系统以及一大堆开发工具、软件架构、网络服务等方面的升级。由于疫情的原因,这两年的 WWDC 都是采用录播形式,不过从视频内容上看,反倒比以前传达地更加精准,对观看者也更加地友善。本文仅从我个人感兴趣的几个角度进行一点介绍,并结合这段时间的学习谈谈使用感受。
操作系统
这几年苹果的系统一直保持一种渐进式的升级态势,即使是大版本号升级通常并不会给人特别大的惊喜和改变。不过也正是在这种逐步的变化中,苹果不断的将它多个系统的联系变得更加紧密,生态建设的愈发完善。网上已经有了大量关于系统新功能的文章,所以我仅从自己的使用上谈几点感受。
iOS 15 在旧设备上的效率相当不错(我在一台 iPhone 7 上进行了安装)。相较于 iPhone,iPad 上对于多任务、多窗口的交互提升观感更明显。在后期软件适配跟上的情况下,iPad 应用或许会有一个新的爆发。Monterey 第一个版本的稳定度明显好于去年的 Big Sur,界面细节的统一性也不错。相较于去年的大规模 UI 改变,今年在 UI 上更多是完善和细节改进。watchOS 8 我没有在实机上测试,我对它新的体能训练类型以及睡眠呼吸率比较感兴趣。
抛开表面功能,因为今年苹果在 Swift 语言以及系统框架的大规模提升,相信不久后适配了新框架和新服务的 App 在新系统上会有很不一样的表现。由于今年绝大多数的 Swift 语言层面、框架层面的新功能都不会下放到老版本的操作系统,所以估计苹果也会继续加大力度促使用户升级。好在,新系统对硬件的涵盖比较广,和最近几年的系统对硬件需求差不多,估计用户的系统更新速度应该会比较快。
Swift
Swift 5.5 可以说是在 5.0 发布以后最重大的更新。在今年 Swift 重构了异步和多线程的解决方案,并提供了 结构式多线程
、Actor
等重磅功能。
Swift 5.5 目前提供的异步、多线程方式对于开发者来说非常友好,从最近的使用来看不仅上手容易,而且可以让自己的代码在极短的时间中受益。目前距离 Swift 5.5 正式发布还有一段时间,除了不可避免的 Bug 外,关键字、语法等也还在不断变化中。Xcode 13 beta 1 中的 Swift Toolchain 关于异步调用语法已经和最近的 snapshot 中有不小的改变。尽管如此,我还是推荐每一个 Swift 开发者都能够尽快地了解这些新的工具、模式,进而可以从另一个角度来思考编程的逻辑。关于异步、多线程的部分,我会在接下来一段时间写几篇文章做更多的介绍。
另一个让我非常有感的 Swift 增强是在 通用上下文中扩展了静态成员的查找
功能。这个看似不大的改动将极大地提高了 自动补全
的表现。官方框架已经对该功能做了充分适配,使用 Xcode 13 你会感慨原来自动补全也可以这么好用。
相较于第一个重磅功能,其他的如 #if
表达式、本地化的 lazy
、属性包装器可用于函数
、枚举适配编码
、Double—CGFloat 相互转换
等只能说是正常提升了。
SwiftUI
学习和使用下来的总体感觉是继续补强和规范。
如果单看 Keynote,你会感觉好像苹果为 SwiftUI 带来了好多新的能力,不过仔细分析后会发现其中绝大多数都已经有较成熟的第三方解决方案了,当然官方的方案确实设计的统一性较好且实现地很优雅,相信这也将影响不少的 SwiftUI 三方库作者。提几个我个人感触较大的改进:
- 输入的全面提升。从
Formatter 绑定
到focusedState
的添加,从onsubmit
到submitLable
以及 Toolbar 中的keyboard placement
,总之全平台上的输入逻辑和设计都有了令人欣喜的提高。官方的方案如果单看某个平台的表现未必最好,不过它的多平台适配能力确实令人佩服。 - 异步概念的全面导入。
task
、refreshable
中都是直接可以执行异步代码的上下文。由于 Swift 5.5 异步编程的简化,苹果在各个框架上都会强力引导开发者采用异步、多线程的方式进行编程。 - 富文本和符号的增强。Text 中可以直接使用
Markdown
符号,尤其是新增的AttributedString
,开发者可以自定义 Markdown 符号(使用效果非常好,有很高的想象空间)。Text + AttributedString 解决了 SwiftUI 上富文本一个非常大的短板。SF 3.0
近一步增加了符号种类,添加了更多的渲染方式,为我这样的个人开发者进一步减轻了美工压力。其他如文本动态尺寸限制、符号变体等也都比较有特点。 - 样式化趋势明显。将一些之前需要定义颜色、尺寸等多个步骤的工作统一成 style。同时也添加了
Material
样式。苹果在 SwiftUI 上喜欢为各个控件使用类似xxxstyle
来定义它的样式,得益于 Swift 5.5 的静态成员查找能力,在代码中调用样式更加方便。这个也会很快在第三方控件上体现出来。 - 列表的全面补强。List 作为使用量巨大的控件一直以来在 SwiftUI 上都有诸多的不足。此次更新添加了诸多期待已久的功能并且调用的方式很 SwiftUI 化。
ForEach
可以使用绑定数据、searchable
搜索解决方案、swipeAction 的侧滑按钮等等,使得以前只能通过重新包装、数据注入才能解决的问题,多数可以直接使用官方提供的方案。另外值得一提的是,终于可以取消分割线了。Section
的加入为数据的组织方式添加了更多的选项。 - 按钮的全方位提升。此次 SwiftUI 为各类 Button 提供了非常好的扩展,比如
controlGroup
在各个不同平台的不同呈现,通过buttonStyle
、controlSize
、controlProminece
、role:
等等仅用几行代码便可以获得官方美工级别的按钮样式,Menu
也支持了二级菜单,并且为 mac 平台添加了.button
的 style 等等。总之在本次版本中按钮呈现的改进是当今任何第三方开发者都没能达到的高度。 - CoreData 配合度近一步提高。@fetchRequest 终于支持动态修改 sortDescripte 和 predicate 了,另外配合 Section 新增了
@SectionedFetchRequest
,极大的提升了 List 的表现能力。 - 其他比较有特点的还有:
Canvas
、TimeLineView
、confirmationDialog
等等众多的新功能。
其中绝大多数的功能,我在之后会通过文章更详细的和大家分享。
遗憾的是,NavigationView 没有在此次升级中补强。
另外,在本次 WWDC 上的 Demystify SwiftUI 绝对不容错过,通过对身份、生命周期、依赖的详细讲述让开发者了解 SwiftUI 的开发哲学及核心原则,并掌握如何使用它们来保证应用程序的准确和性能。
CoreData + Cloudkit
CoreData 在今年的改动不多,主要体现在对同步和多线程的支持上。在本次 WWDC 之前坊间传闻并期望的 SwiftData 并没有出现。不过 Cloudkit 今年还是给我带来了巨大的惊喜:支持了本地化操作的 Share 数据库
。
在 2019 年,通过 NSPersistentCloudKitContainer
苹果打通了 Coredata 同 cloudkit 上的私有库,去年带来了公有库的本地化,今年终于将最后的短板补齐,让开发者可以轻松实现 app 用户同其他的 icloud 用户实时分享数据。为了实现这个功能,Cloudkit 改善了它同本地数据的同步机制,响应不像去年的公共库同步那么迟钝。在今年 WWDC 众多的新功能中,Share Data
是我一直最想要的功能!
Xcode
首先最直观的感觉很多的 图标
变得比以前精致了。Xcode Cloud
看起来不错,但对于个人开发者的我来说还没有什么特别大的吸引力。如果你是 Vim 用户,一定会对 Vim 模式
的到来感到兴奋。版本控制
终于得到了提升,不仅在功能上,即使在界面布局上也看出了此次苹果对于版本控制重要性的认识有了提高。得益于 Swift 的改进,代码补全、错误提示比之前有了不小的进步(测试版中,错误提示还是有点诡异的)。最后,有两个并不完全属于 Xcode 的功能反倒值得特别注意:
- 集成了
Swift Package Collection
。本次苹果推出了 Swift Package Collection,为用户分享和组织第三方库提供了新的选择。Xcode 已经全面集成了对此的支持。 - 全面集成
Docc
。我从 2019 年开始接触 mac 编程,当时的苹果的文档内容并不丰富,这两年有了不小的进步。在第一次看到 SwiftUI 的官方的交互式教程时我相当震惊,希望将来会有更多的类似文档资料。今年,苹果开发了 Docc,一个可以直接从代码构建美丽、交互式和原生文档的新工具。使用它,很轻松地就可以开发出类似苹果官方文档质量的文档集合。苹果在今年内会将其开源,届时即使是其他平台的 IDE 或者其他的开发语言都可以使用它进行文档工作。
其他
WWDC 涉及的领域实在是太多了,大多数的 Session 我都没有时间观看和学习。除了上面提到的变化外,我额外关注了 Foundation 在今年的变化。苹果着重介绍了 AttributedString
和 Formatter
。AttributedString 绝对是接下来在苹果开发生态中富文本的主力,Formatter 对国际化、本地化的支持也达到了空前的高度。另外,从 SwiftUI 的 Text 和 TextField 都可以直接使用 Formatter 的情况来看,苹果将来会在其官方框架中增加对开发人员的引导。
关于 WWDC 的资料
下面是我观看和学习 WWDC 中使用的一些资源:
- Developer (mac AppStore 和 iOS appStore 都可以下载)。推荐使用这个 app 来观看视频,可以点击每个 Session 的旁白或代码片段快速跳转到对应视频片段
- WWDC 官方演示代码 在此网址可以查询视频中提及的演示项目的完整代码
- WWDC NOTES 各个 Essential 的图文整理
- HackingWithSwift 以及他的油管频道
- WWDC21Lounges 的 QA 汇总