SwiftData 学习笔记:简介及基本使用

简介

SwiftData 是 Apple 新推出的特性,用于数据持久化存储。它允许我们创建自定义对象,定义它们如何链接在一起,通过过滤和排序检索它们,甚至还可以将它们同步到 iCloud。

使用 SwiftData 不仅充分享受 Swift 的最新特性,而且它也是完美适配 SwiftUI的。如果你在项目中使用 SwiftUI ,会发现使用 SwiftData 是非常便利的。

SwiftData 的底层是由一个非常成熟的 Core Data 提供支持的。Core Data 已经经过了近 20 年的发展,使用它进行底层支持是可以使我们享受很多好处。但 SwiftData 并不仅是对 Core Data 的一层简单的封装:Apple 确实全力以赴地隔离和解决了开发人员使用旧框架的关键痛点,这意味着 SwiftData 对于过去使用过 Core Data 的任何人来说都是一个重大改进。

美中不足的是:SwiftData 仅支持 iOS 17 或更高版本,以及其他平台相应版本 - 即 macOS Sonoma、tvOS 17、watchOS 10 和 VisionOS 1.0。

SwiftData 是任何类型的设备存储的绝佳选择,包括:

  • 持久化存储用户数据,例如他们的待办事项列表或者浏览历史记录。
  • 用户数据的临时存储,其中 SwiftData 用作从服务器获取的数据的缓存。
  • 基于文档的 APP,比如文本或者视频编辑器。
  • 复杂的用户设置或者历史数据。

下列情况则不是很好的选择:

  • 需要支持许多使用 iOS 16 及更早版本的用户。尽管 SwiftData 和 Core Data 可以在同一个应用程序中并存,但这会需要额外的工作。
  • 数据仅存储在 CloudKit 或其他同等服务中,并且需要始终使用实时数据。
  • 需要 Core Data 提供的全方位功能。 Core Data 的许多功能尚未在 SwiftData 中体现,因此如果你有更高级的用例,你可能应该继续使用 Core Data。

基本使用

对于 SwiftUI 来说,使用 SwiftData 还是非常简单的。假设我们有一个代表时间戳的类:Item,代码如下:

swift 复制代码
final class Item {
    var timestamp: Date
    
    init(timestamp: Date) {
        self.timestamp = timestamp
    }
}

我们需要下面这几步来使用 SwiftData,首先导入该框架,在类的前面加上 @Model 的宏:

swift 复制代码
import SwiftData

@Model
final class Item {
    var timestamp: Date
    
    init(timestamp: Date) {
        self.timestamp = timestamp
    }
}

这样,就完成了关于模型的改造。接下来就是使用它。我们需要在 APP 入口结构体中配置它:

swift 复制代码
var sharedModelContainer: ModelContainer = {
        let schema = Schema([
            Item.self
        ])
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)

        do {
            return try ModelContainer(for: schema, configurations: [modelConfiguration])
        } catch {
            fatalError("Could not create ModelContainer: \(error)")
        }
    }()

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(sharedModelContainer)
    }

我们看到上面的代码主要做了两件事:

  • 配置 ModelContainer,这里的作用就是告诉系统我要数据持久化 Item。
  • 使用 modelContainer 修饰符,告诉系统整个应用程序都会使用该模型。

这样,我们完成了 Item 的持久化的准备工作,接下来就是具体的增删改查了。代码示例:

typescript 复制代码
// 获取模型环境变量的上下文
@Environment(\.modelContext) private var modelContext
// 插入
private func addItem() {
    let newItem = Item(timestamp: Date())
    modelContext.insert(newItem)
}
相关推荐
恋猫de小郭18 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
点金石游戏出海1 天前
每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
游戏·ios·业界资讯·apple·崩坏星穹铁道
旷世奇才李先生1 天前
Swift 安装使用教程
开发语言·ios·swift
90后的晨仔1 天前
Xcode16报错: SDK does not contain 'libarclite' at the path '/Applicati
ios
finger244801 天前
谈一谈iOS线程管理
ios·objective-c
Digitally1 天前
如何将大型视频文件从 iPhone 传输到 PC
ios·iphone
梅名智1 天前
IOS 蓝牙连接
macos·ios·cocoa
美狐美颜sdk1 天前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭2 天前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin
泓博2 天前
Objective-c把字符解析成字典
开发语言·ios·objective-c