温馨提示:本文最后更新于
2025-01-18 14:57:45
,某些文章具有时效性,若有错误或已失效,请在下方留言。您将使用 @Model
宏来定义所有 SwiftData 模型类。该宏会自动使您的类能够从 SwiftData 加载和存储数据,支持观察更改,并添加 Hashable
、Identifiable
、Observable
和 PersistentModel
的遵循。
默认情况下,SwiftData 会包含类的所有非计算属性,只要它们使用兼容的类型。该框架支持基本类型,如Bool
、Int
和 String
,以及符合 Codable
协议的复杂值类型,如结构体、枚举和其他值类型。
在简单的情况下,您的代码如下所示:
@Model class RemoteImage {
var sourceURL: URL
var data: Data
init(sourceURL: URL, data: Data = Data()) {
self.sourceURL = sourceURL
self.data = data
}
}
这段代码现在成为该数据模型的唯一可信来源—一它提供了该类型数据结构的完整定义。
@Model
宏要求您的类型为类;它不适用于结构体。
通过将类标记为 @Model
,SwiftData 会自动将其存储属性转换为读取和写入底层 SwiftData 信息的 getter
和 setter
。其功能更为强大,具体包括:
- 自动监视属性变化:每当 SwiftUl 视图读取 SwiftData 模型对象的属性时,它会自动监视该属性的变化,以便在需要时重新创建视图。
- 简化属性标注:如果您之前使用
@Published
等标注属性,使用 SwiftData 时则不再需要这样做。 - 高效的批量处理:SwiftData 会静默地将多个更改分组,在一次操作中保存,以获得最佳性能。这意味着即使您进行插入、删除和更新操作,它们也会被批量处理。
- 自动保存更改:每当这些批次完成时,SwiftData 会自动保存所有未完成的更改,确保您的数据始终安全
- 计算属性的限制:计算属性不受该宏的影响,且不会存储在SwiftData 的持久化存储中。
模型中使用枚举
SwiftData 支持符合 Codable
协议的结构体和枚举(包括带有原始值或关联值的枚举)。下面是在模型中使用枚举的示例:
import SwiftData
enum PasteType: String, Codable {
case text = "text"
case url = "url"
}
@Model final class PasteData {
var text: String = ""
var type: PasteType = PasteType.text
init(type: PasteType = PasteType.text, text: String = "") {
self.type = type
self.text = text
}
}
1. 枚举及其关联值会直接存储在数据库记录中,不创建独立表,值类型属性会成为存储中的字段。
2. 支持存储基本类型、结构体、枚举和符合 Codable
的数据类型。
3. 使用值类型集合(如 [String]
)时,集合数据会被编码为二进制属性列表,这意味着无法在谓词中使用数组内容,可能会导致运行时崩溃。
模型中使用结构体
可以将结构体集成到你的模型中,只要这些结构体符合 Codable
协议。例如:
@Model
class Customer {
var name: String
var address: Address
init(name: String, address: Address) {
self.name = name
self.address = address
}
}
struct Address: Codable {
var line1: String
var line2: String
var city: String
}
© 版权声明
THE END
暂无评论内容