SwiftData 是苹果官方新推出的数据持久化框架,它提供了表现力强的轻量级 API,可用于使用纯 Swift 代码对 App 的数据进行建模并持久保留数据。而且新增的 API 可以帮助你构建自定数据存储,处理交易历史记录、模型索引和复合唯一性约束,等等。
下面让我们来看下如何用 SwiftData 来定义数据模型!
使用 SwiftData 定义模型
在 SwiftData 中,我们所有的模型都是用代码创建的,也就是说我们可以和Xcode中的 Core Data 模型编辑器 UI 说再见了,因为现在一切都是用纯 Swift 代码来进行模型描述的。
对于这个项目,我们将创建一个简单的模型来描述一个人,因此创建一个名为 Person.Swift 的新 Swift 文件,模型定义代码如下:
class Person {
var name: String
var address: String
var age: Int
var level: Int
}
上述代码可以看到,这是一个类。尽管在 Swift 中结构体十分强大,且一般推荐大家优先使用结构体,但我们最终还是需要一种方法来在应用的各个部分之间共享数据,而类就是做这个事的。
因为它是一个类,所以我们需要为它提供初始化构造器。如果你只是在类文件的某个地方开始输入 i,它会提示你完成完整的初始化器。示例代码如下:
class Person {
var name: String
var address: String
var age: Int
var level: Int
init(name: String, address: String, age: Int, level: Int) {
self.name = name
self.address = address
self.age = age
self.level = level
}
}
在开发的代码习惯中我喜欢给初始化构造器的各个参数提供一个默认值。当创建一个新的 person 实例对象时,所有的值都是空的。这样,当我们进行代码调试制造假数据的时候,可以更加方便
因此,将你的初始化器修改为:
init(name: String = "", address: String = "", age: Int = 0, level: Int = 0)
到目前为止,这些都是非常标准的 Swift,但现在是时候引入 SwiftData了。这只需要三步:
- 将
import SwiftData添加到Person.swift和SwiftDataDemoApp.swift的顶部。 - 在
Person类之前添加@Model宏。 - 将这个修改器添加到
SwiftDataDemoApp.swift:.modelContainer(for: Person.self)中的WindowGroup中。 就是这样:这三个变化,都是微不足道的,完事之后我们就可以便捷的使用 SwiftData 的各种接口了。示例代码如下:
// SwiftDataDemoApp
import SwiftUI
import SwiftData
@main
struct SwiftDataDemoApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(for: Person.self)
}
}
// Person
import Foundation
import SwiftData
@Model
class Person {
var name: String
var address: String
var age: Int
var level: Int
init(name: String = "", address: String = "", age: Int = 0, level: Int = 0) {
self.name = name
self.address = address
self.age = age
self.level = level
}
}
第一个只是在两个文件中添加一个 import 语句,这样我们就可以访问 SwiftData 的所有功能,但另外两个改动还是有必要说一下的。
@Model 宏告诉 SwiftData,我们希望能够使用 SwiftData数据库加载和保存 Person对象。这在幕后增加了一大堆功能,这样 SwiftData 就可以检测到我们何时改变了 Person 对象中的单个属性,并确保它们被自动保存。而且它还可以进行延迟加载数据来节省内存。
至于modelContainer修饰符,它告诉SwiftData我们想要:
为我们的 Person 对象创建存储,或者如果之前已经创建了,就加载它。
用它将所有数据存储在窗口组中,这是我们的整个应用。
如果你以前使用过 Core Data,这个模型容器相当于一个 NSPersistentContainer,但如果你的应用启用了 iCloud ,它也会兼任一个 NSPersistentCloudKitContainer。
到这里,我们就完成了使用 SwiftData 定义数据模型的功能。下一篇我们将其与 SwiftUI 结合起来。毕竟在移动端数据也是为 UI 服务的。