浅谈 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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
iOS日常7 小时前
Xcode 垃圾清理
ios·xcode
开心就好20259 小时前
不越狱能抓到 HTTPS 吗?在未越狱 iPhone 上抓取 HTTPS
后端·ios
傅里叶13 小时前
iOS相机权限获取
flutter·ios
zhangkai1 天前
flutter存储知识点总结
flutter·ios
齐生12 天前
网络知识点 - TCP/IP 四层模型知识大扫盲
笔记·ios
IT技术分享社区2 天前
数码资讯:iPhone 18 Pro,十大升级细节浮出水面
ios·手机·iphone
嵌入式学习菌2 天前
https不校验证书实现及https接口实现
ios·iphone
Swift社区2 天前
LeetCode 391 完美矩形 - Swift 题解
算法·leetcode·swift