Swift Data 的初步探索

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:设置 uniqueexternalStoragespotlight 等属性。
  • @Relationship:自定义模型间的关系,从而确定诸如删除等操作的行为。
1
2
3
4
5
6
7
8
9
10
@Model
class Trip {
@Attribute(.unique) var name: String
var destination: String
var endDate: Date
var startDate: Date

@Relationship(.cascade) var bucketList: [BucketListItem]? = []
var livingAccommodation: LivingAccommodation?
}

这段代码中:

  • 确保了 name 字段的唯一性。
  • 指定了 Trip 与 BucketListItem 之间的关系,即一旦 Trip 被删除,所有的 BucketListItem 也会被一并删除。

注入

在 SwiftUI 中,在最简单的情况下,只需要在 ContentView 后加一句 .modelContainer(for: ) 即可。

但是在业务复杂的情况下,例如需要做数据库迁移或更新这类操作时,或者在其他环境下使用 Swift Data,你可能就需要一个 Container 容器来操作了。

创建的方法也很简单:

1
2
3
4
5
6
let container = try ModelContainer([Trip.self, LivingAccommodation.self])

let container = try ModelContainer(
for: [Trip.self, LivingAccommodation.self],
configurations: ModelConfiguration(url: URL("path"))
)

获取 Container Context:

  • 在 SwiftUI 下访问 Model Container:@Environment(\.modelContext) private var context
  • 如果不在 View 层级,例如在 ViewModel 中,可以使用 container.mainContext 来获得共享的主线程上下文

筛选

PredicateSortDescriptor 等之前晦涩难懂且不安全的 API 也更新了,可以更加 Swift 化地使用他们了。

获取数据变成了这样,更加直观了:

1
2
3
4
5
6
7
8
let today = Date()
let tripPredicate = #Predicate<Trip> {
$0.destination == "New York" &&
$0.name.contains("birthday") &&
$0.startDate > today
}
let descriptor = FetchDescriptor<Trip>(predicate: tripPredicate)
let trips = try context.fetch(descriptor)

增、删、存

1
2
3
4
5
6
7
8
9
10
var myTrip = Trip(name: "Birthday Trip", destination: "New York")

// Insert a new trip
context.insert(myTrip)

// Delete an existing trip
context.delete(myTrip)

// Manually save changes to the context
try context.save()

小结

其实我是非常愿意使用新的 Swift Data 的,苹果应该也会在接下来的几个 Beta 中不断完善这个框架。

正如肘子老师在 WWDC.playground 中所说的,Swift Data 对于有一定 Core Data 基础的人来说使用起来非常简单,但是 Swift Data 目前也存在不少问题,而其中最致命的莫过于没有办法做向后兼容了,其次包括 iCloud 同步在内的很多功能都没法使用(这里的信息来自肘子老师的推文,我没有尝试 iCloud 的部分)。

作者

LiYanan

发布于

2023-06-17

更新于

2023-06-17

许可协议

评论