使用 @Model 宏定义模型

温馨提示:本文最后更新于2025-01-18 14:57:45,某些文章具有时效性,若有错误或已失效,请在下方留言

您将使用 @Model 宏来定义所有 SwiftData 模型类。该宏会自动使您的类能够从 SwiftData 加载和存储数据,支持观察更改,并添加 HashableIdentifiableObservablePersistentModel 的遵循。

默认情况下,SwiftData 会包含类的所有非计算属性,只要它们使用兼容的类型。该框架支持基本类型,如BoolIntString,以及符合 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 信息的 gettersetter。其功能更为强大,具体包括:

  • 自动监视属性变化:每当 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
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容