浅谈 iOS 新框架 SwiftData 的使用

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

在今年的 WWDC23 上,Apple 推出了新框架 SwiftData,这是一个专注于使用声明式代码持久化数据的框架。SwiftData 使用 Swift 的新宏功能,旨在与 SwiftUI 配合使用,代替 CoreData。

关于 swift 中新出的宏,之前的文章中也有介绍过,感兴趣可以去看看。

完整介绍一下关于 Xcode 15 新出的宏

因为 SwiftData 在 iOS 17 才能使用,项目上一时半会儿还不用上,所以这里只是简单的讲一下普通的用法,混个脸熟,防止面试什么的被问到。

使用 @Model 宏定义架构

要往数据库中存储数据之前,需要先设计你的模型架构,这是一切的第一步,SwiftData 引入了 @Model 这个宏,它允许我们直接使用 Swift 定义模型。让我们看一个简单的例子:

typescript 复制代码
@Model
class User {
    let id: String
    let name: String
}

使用 SwiftData 定义模型时,我们可以将所有基本类型(String/Int/Double 等等)开箱即用。

另外我们还可以使用符合 Codable 协议的自定义类型,比如自定义的结构体和枚举。

SwiftData 提供了能够控制属性的持久化方式的方法。例如,我们可以使用 @Attribute 宏向属性添加唯一性约束(表的主键):

typescript 复制代码
class User {
    /// id 设为主键
    @Attribute(.unique) let id: String
    let name: String
}

默认情况下,SwiftData 会将所有存储属性持久化,如果你想从持久化中排除某个属性,可以使用 @Transient 宏:

kotlin 复制代码
class User {
    @Transient var isMan: Bool
}

模型容器

要使用 SwiftData,App 需要设置至少一个模型容器,可以使用它来控制持久性的行为。

创建一个模型容器,传入要存储的模型类型:

php 复制代码
let modelContainer = try? ModelContainer(for: User.self)

还可以给容器设置多个配置,以便控制其行为:

ini 复制代码
modelContainer?.configurations = [ModelConfiguration(isStoredInMemoryOnly: true)]

模型上下文

SwiftData 的模型上下文主要用来对数据的操作,比如可以用上下文进行数据存储、插入、删除、更新、撤销等等。

首先创建一个上下文:

ini 复制代码
let context = ModelContext(container)

然后就可以用这个上下文对象来操作存储了,比如我们存储一个新用户:

less 复制代码
let context = ModelContext(modelContainer)
context.insert(User(id: "1", name: "iOS 新知识"))
try? context.save()

模型上下文还可以很方便的获取数据,比如我们获取所有存储的用户:

ini 复制代码
let fetchDescriptor = FetchDescriptor<User>()
let users = try modelContext.fetch(fetchDescriptor)

也可以根据条件来筛选,比如我们获取刚刚存储的 User:

swift 复制代码
let modelContext = ModelContext(modelContainer)
/// 查找用户名为 "iOS 新知识" 的用户
let predicate = #Predicate<User> { $0.name == "iOS 新知识" }
let fetchDescriptor = FetchDescriptor<User>(predicate: predicate)
let users = try? modelContext.fetch(fetchDescriptor)
print(users)

以上就是关于 SwiftData 简单的基础知识了,相比写那些硬编码的 SQL,这种方式是不是又简单又好用?

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
碎_浪21 小时前
Mac 壁纸被 MDM 锁住?我做了个 2MB 的开源方案
macos·开源·swift
2501_916008891 天前
iOS 证书管理最佳实践 从创建到续期的完整指南
android·ios·小程序·https·uni-app·iphone·webview
黑科技iOS上架2 天前
ReactNative入门介绍
经验分享·ios
智塑未来2 天前
鸿蒙系统对比安卓、iOS,核心优势是什么?
android·ios·harmonyos
初雪云2 天前
iOS 上架入门:证书、描述文件、IPA 上传到底是什么关系?
android·ios·自动化·产品经理·iphone
狂热开发者2 天前
用 Typeoff 把会后口述整理成 Markdown 决策记录
人工智能·windows·macos·ios·安卓
小牛不牛的程序员2 天前
开源一个 macOS 剪贴板「意图识别」工具——不只是存储,更是理解你复制了什么
macos·swift
2501_916007472 天前
iPad 怎么抓包 从代理模式到暴力抓包的操作方法
android·ios·小程序·uni-app·代理模式·iphone·ipad
2501_915918412 天前
PerfDog 太贵?iOS 性能监控工具的功能对比与选择
android·ios·小程序·https·uni-app·iphone·webview
MDM.Plus3 天前
苹果MDM技术演进:从远程控制到设备信任体系的构建
运维·服务器·安全·ios·mdm·手机店