Swift Data 的初步探索
朋友们好,一周的考试结束了,我回来继续更新了,感觉考的不错,暑假里争取多更新一些。
今天的主题是 Swift Data – Core Data 的 Swift 化封装。
本文为 Meet Swift Data 的学习笔记。
模型
借助 Swift 5.9 的 Macro,开发者可以很容易地创建一个数据模型,并可以将之以 @Observable
的方式注入 SwiftUI View 成为 Source Of Truth,并且与 @Observable
获得了一致的只刷新变化的值的特性。
在 Model 中,我们可以更加容易地使用自定义的 struct、enum 等之前在 Model Editor 中不好引入的自定义类型。
@Model 也支持模型与模型之前的关系和属性:
@Attribute
:设置unique
、externalStorage
、spotlight
等属性。@Relationship
:自定义模型间的关系,从而确定诸如删除等操作的行为。
1 |
|
这段代码中:
- 确保了
name
字段的唯一性。 - 指定了 Trip 与 BucketListItem 之间的关系,即一旦 Trip 被删除,所有的 BucketListItem 也会被一并删除。
注入
在 SwiftUI 中,在最简单的情况下,只需要在 ContentView 后加一句 .modelContainer(for: )
即可。
但是在业务复杂的情况下,例如需要做数据库迁移或更新这类操作时,或者在其他环境下使用 Swift Data,你可能就需要一个 Container 容器来操作了。
创建的方法也很简单:
1 | let container = try ModelContainer([Trip.self, LivingAccommodation.self]) |
获取 Container Context:
- 在 SwiftUI 下访问 Model Container:
@Environment(\.modelContext) private var context
- 如果不在 View 层级,例如在 ViewModel 中,可以使用
container.mainContext
来获得共享的主线程上下文
筛选
Predicate
、SortDescriptor
等之前晦涩难懂且不安全的 API 也更新了,可以更加 Swift 化地使用他们了。
获取数据变成了这样,更加直观了:
1 | let today = Date() |
增、删、存
1 | var myTrip = Trip(name: "Birthday Trip", destination: "New York") |
小结
其实我是非常愿意使用新的 Swift Data 的,苹果应该也会在接下来的几个 Beta 中不断完善这个框架。
正如肘子老师在 WWDC.playground 中所说的,Swift Data 对于有一定 Core Data 基础的人来说使用起来非常简单,但是 Swift Data 目前也存在不少问题,而其中最致命的莫过于没有办法做向后兼容了,其次包括 iCloud 同步在内的很多功能都没法使用(这里的信息来自肘子老师的推文,我没有尝试 iCloud 的部分)。
Swift Data 的初步探索