2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

苹果推出 SwiftData,持久化框架的技术革新

  • 2023-06-19
    北京
  • 本文字数:1115 字

    阅读完需:约 4 分钟

苹果推出 SwiftData,持久化框架的技术革新

苹果于 WWDC 2023 上推出新框架 SwiftData,提供声明性的、以 Swift 为先的 API,可在 iOS 应用中进行数据持久化工作。SwiftData 可轻松将一个 Swift 类转换为一个持久化模型,非常适合同 SwiftUI 一并使用。


在几年前通过 SwiftUI 改变了 UI 在其平台上的定义方式后,苹果正在迈出超越 Core Data 的第一步,即一个基于 ORM、严格绑定于 Objective-C 动态能力的持久化框架。


虽然 SwiftUI 所提供的 API 让持久化模型的定义成为可能,但这种方式却颇为繁琐。Core Data 通常是在 Xcode 内集成的 Schema Model 编辑器上使用,由此生成的 .xcdatamodeld 是真实之源,可被用于自动生成存根(stub)。存根所提供的基类则被用作实际模型的基类。


SwiftData 的方式则完全相反,它是将代码看作是真实之源,并以此定义一个简单的模型:


@Modelclass Recipe {    @Attribute(.unique) var name: String    var summary: String?    var ingredients: [Ingredient]}
复制代码


仔细看能发现 SwiftData 是如何依赖 Swift 5.9 中新引入的宏功能。简而言之,@Model 宏会将 @PersistedProperty 应用于 Recipe 类的所有属性,并在类的实现中添加初始化代码和其他的必要属性。


由于这层额外的逻辑对开发者而言完全透明,SwiftData 得以将所有属性映射至其底层存储。据苹果公司称,持久性对象会在需要时从持久化存储中获取并更新。


BoolIntString 等简单类型支持开箱可用,但更为复杂的类型则必须要符合 Codable 协议,才能于持久化类中使用。


如上文所述,SwiftData 与 SwiftUI 的相性很好。而事实上,@Model 宏也会让类在符合 ObservableObject 协议的同时,让所有持久化的属性表现为 @Published 属性的形式。此外,将 SwiftUI 视图接入持久化模型只需使用一个新的 @Query 属性。与 @State 和 @Binding 的使用方式相类似,每次底层数据发生变化时,@Query 可确保视图的自动重新渲染。


SwiftData 中还提供对谓词(Predicate)定义的支持,可用于过滤数据。编译时对谓词进行检查,并对类型不匹配的问题报编译错误。此外,SwiftData 模型也可通过 CloudKit 或以 iCloud 云盘中存储的文件形式进行跨设备同步。


为让开发者能更为轻松地迁移至 SwiftData,该框架支持在现有 Core Data 应用中的逐步采用,在苹果提供的演示项目中展示了如何在一个 Core Data 应用中仅部分使用 SwiftData。


最后值得留意的是,SwiftData 并不是换了皮的 Core Data。正如苹果于 WWDC 中所演示的,SwiftData 是借助了同 Core Data 一样的持久化引擎,但却是一个完全独立的堆栈。


原文链接

Apple Introduces SwiftData, a SwiftUI-Ready Core Data Replacement


相关阅读:

Swift 5.8新特性预览:支持函数向后部署

苹果现已支持 Swift 包索引

2023-06-19 08:009897

评论

发布
暂无评论
发现更多内容

jackson解析泛型的正确写法

4ye

Java Jackson 8月日更

Grafana 配置 Thanos 查询历史数据

耳东@Erdong

Grafana Prometheus Thanos 8月日更

有什么理由将代码保存为 GBK 编码

HoneyMoose

白话机器学习:什么机器学习模型?

杜嘉平

机器学习 数据分析 数字化转型

【前端 · 面试 】HTTP 总结(九)—— HTTP 协商缓存

编程三昧

面试 8月日更 HTTP缓存

【Vue2.x 源码学习】第三十篇 - diff算法-比对优化(上)

Brave

源码 vue2 8月日更

白话机器学习(3):理解机器学习中的Bias与Variance

杜嘉平

机器学习

白话机器学习(7):人类最好理解的预测模型-决策树Decision Tree

杜嘉平

阿里P8教你Java注解与反射

陈皮的JavaLib

Java 面试 8月日更 java注解 反射机制

Java 面试都只是背答案不

HoneyMoose

几十种编程语言说Hello World

入门小站

工具

白话机器学习(2):产品经理都在用的线性回归模型

杜嘉平

机器学习 线性回归

Node.js 实现存储服务的上传功能【包含前后端代码】

liuzhen007

8月日更

数据缓存历险记(四)--LRU大师兄的Java实现

卢卡多多

redis LRU 8月日更

白话机器学习(4):模型的裁判-交叉验证Cross-Validation

杜嘉平

机器学习 杜吉普

不装了、摊牌了,我们要搞事情

不脱发的程序猿

程序员 技术 程序人生

构建Apache Flink 开发环境(四)

Databri_AI

flink IDEA 开发环境

前端之数据结构(六)图

Augus

数据结构 8月日更

【LeetCode】超级丑数Java题解

Albert

算法 LeetCode 8月日更

架构训练营模块四作业

Lemon

synchronized优化手段:锁膨胀、锁消除、锁粗化和自适应自旋锁...

王磊

Java 并发 synchronized 8月日更

白话机器学习(5):更高端的线性回归模型-Ridge Regression

杜嘉平

机器学习

Linux之ping命令

入门小站

Linux

如何加强自己对Java的编码规范

Bob

Java 8月日更

奥运背后的5G赛场,竟然也这么激烈?

脑极体

python-抽象

加里都好

写作 7 堂课——【4. 联机式写作】

LeifChen

素材 写作技巧 8月日更 联机 写作网感

趁着课余时间学点Python(八)函数的简单理解

ベ布小禅

8月日更

负载均衡的原理与设计

海明菌

负载均衡 负载均衡算法 负载均衡架构

白话机器学习(6):用Lasso Regression踢出浑水摸鱼的变量

杜嘉平

机器学习

白话机器学习(8):世界上本没有随机森林,决策树多了,也就变成了森林

杜嘉平

机器学习

苹果推出 SwiftData,持久化框架的技术革新_移动_Sergio De Simone_InfoQ精选文章