@Transient 宏忽略属性持久化

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

如果你的模型类有一个或多个存储属性,希望在写入持久化存储时忽略一些属性,可以使用 @Transient 宏进行标注,这样 SwiftData 就不会将它们的值写入磁盘。

默认情况下,SwiftData 会将所有计算属性视为临时属性,因此你无需显式标注这些属性。

@Model class RemoteImage {
    var sourceURL: URL
    var data: Data
    @Transient var isDownloading = false
    @Transient var levels = 0
    init(sourceURL: URL, data: Data = Data(), isDownloading: Bool) {
        self.sourceURL = sourceURL
        self.data = data
        self.isDownloading = isDownloading
    }
}

除非被注解的属性类型是可选的,@Transient 宏要求您提供默认值。这一限制确保了在执行获取操作时,SwiftData 能够成功实例化封闭模型类的实例。模型中的 levels 属性在应用运行时的默认值为 0,并且在应用终止时会自动重置为0—该属性不会被存储在SwiftData中。

SwiftData 仅自动保存模型的存储属性,而所有计算属性都会被视为临时属性。例如,如果我们希望将 Player 模型放入 levelsPlayed 中,可以添加一个计算属性来显示他们的姓名和分数:

@Model class Player {
    var name: String
    var score: Int
    @Transient var levelsPlayed = 0
    var highScoreEntry: String {
        "\(name) scored \(score) points"
    }
    init(name: String, score: Int) {
        self.name = name
        self.score = score
    }
} 

1. 临时属性不能用于 SwiftData 查询谓词,因为相关数据并不存储在磁盘上。虽然在编译时不会出错,但在运行时会导致崩溃。
2.临时属性必须始终提供默认值,以确保在创建新对象或从磁盘获取现有对象时,始终有一个有效值。
3. 任何计算属性都会被视为临时属性,例如上面示例中 highScoreEntry 不会写入磁盘。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容