在这里插入图片描述

概述

各位似秃似不秃小码农们都知道,在苹果众多开发平台中 CoreData 无疑是那个最简洁、拥有“官方认证”且最具兼容性的数据库框架。使用它可以让我们非常方便的搭建出 App 所需要的持久存储体系。

在这里插入图片描述

不过,大家是否知道在 CoreData 中还存在一个 Transformable 类型,它到底是个啥?应用场景有哪些?在最新的 SwiftData 中有没有对应物?对于开发者又有哪些“见雀张罗”的撸码陷阱和最佳实践呢?

在本篇博文中,您将学到如下内容:

  • 概述
  • 7. Transformable 和 Binary Data 类型的区别
    • 7.1 相同之处
    • 7.2 核心区别
    • 7.3 选择建议
  • 8. SwiftData 中有 Transformable 类型吗?
    • 8.1 为什么 SwiftData 没有 `Transformable` 类型?
    • 8.2 SwiftData 中处理 `Transformable` 场景的两种方式
      • 8.2.1 方法 1:直接使用 `Codable` 类型
      • 8.2.2 方法 2:手动处理二进制数据(类似 `Binary Data`)
    • 8.3 关键对比:CoreData vs SwiftData
    • 8.4 迁移 CoreData `Transformable` 到 SwiftData
  • 总结

本系列文章一共包括将近 3w 枚机智而幽默的文字、详实的大段代码示例以及海量图片,定能让小伙伴们对 Transformable 类型的“驾驭”更加胸有成竹、胜券在握!

那还等什么呢?让我们马上开始 Transformable 大冒险吧!
Let’s go!!!😉


7. Transformable 和 Binary Data 类型的区别

经过前面几篇文章的讨论,相信大家都对 Transformable 类型有了相当的了解。

熟悉 CoreData 的小伙伴们都知道,除了 Transformable 以外,对于托管类型的字段来说还有另一种 Binary Data 类型,它也可以被用来存储具体的数据。那么它和 Transformable 类型又有什么异同呢?

在 CoreData 中,TransformableBinary Data 是两种不同的数据类型,它们的核心区别在于 数据存储方式使用场景,但也有一些相似之处。

接下来,就让我们娓娓道来吧。

7.1 相同之处

特性Transformable & Binary Data
存储形式最终都以二进制形式(BLOB)存储在 SQLite 中(或其他持久化存储)
灵活性都可存储非结构化数据(如自定义对象、二进制流等)
内存映射数据在加载到内存前不会完全解包,适合处理大文件或懒加载场景

7.2 核心区别

特性TransformableBinary Data
数据类型存储 自定义对象(如 structclass 实例等)存储原始 二进制数据(如 NSDataData
序列化/反序列化自动转换:通过 NSValueTransformer 将对象序列化为 NSData,反之亦然手动处理:直接操作二进制数据,需自行解析内容(如解码为图片、字符串等)
使用场景适合存储 结构化自定义数据(如 UIColor、自定义配置类、复杂模型等)适合存储 原始二进制数据(如文件、图片、加密数据、未格式化的字节流等)
代码侵入性需要实现 NSSecureCoding 协议或自定义 NSValueTransformer无需额外代码,直接操作 Data 对象
数据版本兼容性如果对象结构变化(如新增属性),需处理数据迁移数据格式变化时,需自行处理兼容性(如更新解析逻辑)
安全性使用 NSSecureUnarchiveFromDataTransformer 可防止恶意数据注入(iOS 12+ 推荐)需自行验证二进制数据的合法性

7.3 选择建议

场景推荐类型理由
存储自定义对象(需结构化序列化)Transformable自动处理对象与二进制数据的转换,代码更简洁
存储原始二进制流(如文件、图片)Binary Data直接操作 Data,无需序列化开销
需要跨平台兼容性Binary Data避免依赖特定平台的序列化实现(如 NSSecureCoding
数据安全性要求高Transformable使用 NSSecureUnarchiveFromDataTransformer 防止恶意数据反序列化

最后,再简单说一下适配 Transformable 和 Binary Data 需要注意的地方:

  • Transformable 的开销:序列化/反序列化过程会增加 CPU 和内存消耗,不适合频繁读写大的数据
  • Binary Data 的优化:对于大文件(如图片、视频),建议启用 Allows External Storage 选项,让 CoreData 自动决定是否将数据存储在独立外部文件中。

通过合理选择 TransformableBinary Data 类型,我们可以高效管理 CoreData 中的复杂数据,同时平衡开发效率与性能。

那么,大家现在对它们的优缺点和应用场景是不是了然于胸了呢?

8. SwiftData 中有 Transformable 类型吗?

最后一个问题是,在苹果最新的 SwiftData 框架中有没有类似 Transformable 的类型呢?
在这里插入图片描述

其实,在 SwiftData 中 Transformable 类型的概念并没有直接出现,但这并不意味着无法处理原本需要 Transformable 的场景。SwiftData 通过更现代化的设计模式和 Swift 原生特性(如 Codable 协议和类型安全),提供了更简洁的解决方案。

下面,我们就对此来详细分析一番吧!

8.1 为什么 SwiftData 没有 Transformable 类型?

  1. 设计哲学差异

    • CoreDataTransformable 是为了兼容 Objective-C 时代的 NSCoding 协议,需要手动管理序列化和反序列化。
    • SwiftData 基于 Swift 的原生类型系统,鼓励直接使用 Codable 协议和 Swift 原生类型,减少样板代码。
  2. 类型安全优先

    • SwiftData 通过 @Model 宏和 Swift 类型推断,直接支持复杂类型的存储,无需显式声明 Transformable
    • 核心思想是 “只要我们的类型可以表示为 Swift 原生类型或遵循 Codable,就可以直接存储”

8.2 SwiftData 中处理 Transformable 场景的两种方式

8.2.1 方法 1:直接使用 Codable 类型

如果自定义类型遵循 Codable 协议,SwiftData 会自动将其序列化为二进制数据存储(类似 Transformable 的底层行为)。

示例:存储自定义 AppConfig 对象

// 1. 定义自定义类型并遵循 Codable
struct AppConfig: Codable {var smartVer: Intvar fontSize: CGFloat
}// 2. 在 SwiftData 模型中直接使用该类型
@Model
class Settings {var config: AppConfig // SwiftData 自动处理序列化init(config: AppConfig) {self.config = config}
}

8.2.2 方法 2:手动处理二进制数据(类似 Binary Data

对于非 Codable 类型或需要完全控制序列化逻辑的场景,可以手动转换为 Data 存储。

示例:存储 UIColor

@Model
class Settings {// 将颜色存储为 Dataprivate var colorData: Data// 通过计算属性访问 UIColorvar themeColor: UIColor {get {return try! NSKeyedUnarchiver.unarchivedObject(ofClass: UIColor.self, from: colorData) ?? .systemBlue}set {colorData = try! NSKeyedArchiver.archivedData(withRootObject: newValue, requiringSecureCoding: true)}}init(themeColor: UIColor) {self.colorData = try! NSKeyedArchiver.archivedData(withRootObject: themeColor, requiringSecureCoding: true)}
}

8.3 关键对比:CoreData vs SwiftData

场景CoreData 实现SwiftData 实现
存储自定义对象使用 Transformable + NSCoding直接使用 Codable 类型
存储非 Codable 对象自定义 NSValueTransformer手动转换为 Data 存储,通过计算属性封装访问逻辑
代码复杂度需手动实现序列化/反序列化利用 Swift 原生特性(如 Codable)减少代码
类型安全性依赖运行时类型检查编译时类型安全

8.4 迁移 CoreData Transformable 到 SwiftData

  1. 简单迁移

    • 如果原 CoreData 的 Transformable 类型已遵循 Codable,可以直接替换为 SwiftData 中的对应类型。
  2. 复杂迁移

    • 对于依赖 NSCoding 的旧类型,在 SwiftData 中重构为 Codable 类型,或使用手动 Data 转换。

综上所述,SwiftData 通过拥抱 Swift 原生特性(如 Codable)和编译时类型安全,简化了原本需要 Transformable 的场景。开发者可以:

  • 直接存储 Codable 类型:无需额外配置,SwiftData 自动处理序列化。
  • 手动管理二进制数据:通过 Data 属性和计算属性的封装,灵活把控非标准类型。

这种设计既保留了灵活性,又大幅减少了模板代码,更符合现代 Swift 开发范式,就问小伙伴们赞不赞呢?

到这里,我们已经对 CoreData 中的 Transformable 类型有了全面而详细的理解和实践,一路走来不易,感谢大家的观看和学习!

小伙伴们不妨给自己点一个大大的赞吧!棒棒哒!💯

总结

在本篇博文中,我们先是介绍了 Transformable 和 Binary Data 类型的异同,并随后讨论了 Transformable 对应物在 SwiftData 中的实现。

感谢观赏,再会啦!😎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87607.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87607.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87607.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车LIN总线通讯:从物理层到协议栈的深度解析

目录一、物理层:单线传输的信号奥秘1.1 电平定义与信号传输1.2 关键硬件组件作用二、数据链路层:帧结构与通信协议2.1 LIN帧的组成与功能2.2 主从式通信机制三、波特率同步:从节点的时钟校准原理四、软件实现:基于S32K144的主节点…

马尔可夫链:随机过程的记忆法则与演化密码

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 一、核心定义:无记忆的随机演化 马尔可夫链(M…

【vue3+tauri+rust】如何实现下载文件mac+windows

项目背景:【vue3taurirust】 由于Safari对于下载总是有诸多阻拦,目前需求windowsmac可以实现: 后端返回的url文件可以下载;前端根据dom元素生成的PDF报告可以下载(无远程URL); 我的尝试: 方法…

SQL 快速参考手册-SQL001

SQL 快速参考手册: 为方便快速学习和实践,提供了一份 SQL 快速参考手册,您可以打印出来随时查看,了解常见 SQL 命令的语法和用法。 SQL 数据类型 SQL 数据类型根据不同的数据库系统(如 Microsoft Access、MySQL、SQL…

学习java集合

集合与数组的对比集合的长度可变, 数组的长度不可变集合实际上跟数组一样, 是一种容器, 可以存放数据数组可以直接存放基本数据类型和引用数据类型集合可以存放引用数据类型, 但是不能直接存放基本数据类型, 如果要存放基本数据类型, 需要变成一个包装类才行泛型: 限定集合中存…

python训练day49 CBAM

import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self, in_channels, ratio16):"""通道注意力机制初始化参数:in_channels: 输入特征图的通道数ratio: 降维比例,用于减少参数量,默认…

在小程序中实现实时聊天:WebSocket最佳实践

前言 在当今互联网应用中,实时通信已经成为一个标配功能,特别是对于需要即时响应的场景,如在线客服、咨询系统等。本文将分享如何在小程序中实现一个高效稳定的WebSocket连接,以及如何处理断线重连、消息发送与接收等常见问题。 W…

Python网络爬虫编程新手篇

网络爬虫是一种自动抓取互联网信息的脚本程序,广泛应用于搜索引擎、数据分析和内容聚合。这次我将带大家使用Python快速构建一个基础爬虫,为什么使用python做爬虫?主要就是支持的库很多,而且同类型查询文档多,在同等情…

LeetCode.283移动零

题目链接:283. 移动零 - 力扣(LeetCode) 题目描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行…

2025年7月4日漏洞文字版表述一句话版本(漏洞危害以及修复建议),通常用于漏洞通报中简洁干练【持续更新中】,漏洞通报中对于各类漏洞及修复指南

漏洞及修复指南 一、暗链 危害:攻击者通过技术手段在用户网页中插入隐藏链接或代码,并指向恶意网站,可导致用户信息泄露、系统感染病毒,用户访问被劫持至恶意网站,泄露隐私或感染恶意软件,被黑客利用进行…

python --飞浆离线ocr使用/paddleocr

依赖 # python3.7.3 paddleocr2.7.0.2 paddlepaddle2.5.2 loguru0.7.3from paddleocr import PaddleOCR import cv2 import numpy as npif __name__ __main__:OCR PaddleOCR(use_doc_orientation_classifyFalse, # 检测文档方向use_doc_unwarpingFalse, # 矫正扭曲文档use…

数据结构与算法:贪心(三)

前言 感觉开始打cf了以后贪心的能力有了明显的提升,让我们谢谢cf的感觉场。 一、跳跃游戏 II class Solution { public:int jump(vector<int>& nums) {int n=nums.size();//怎么感觉这个题也在洛谷上刷过(?)int cur=0;//当前步最远位置int next=0;//多跳一步最远…

【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案

&#x1f4ab;《博主主页》&#xff1a;    &#x1f50e; CSDN主页__奈斯DB    &#x1f50e; IF Club社区主页__奈斯、 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对…

Docker 实践与应用案例

引言 在当今的软件开发和部署领域&#xff0c;高效、可移植且一致的环境搭建与应用部署是至关重要的。Docker 作为一款轻量级的容器化技术&#xff0c;为解决这些问题提供了卓越的方案。Docker 通过容器化的方式&#xff0c;将应用及其依赖项打包成一个独立的容器&#xff0c;…

《论三生原理》以非共识路径实现技术代际跃迁‌?

AI辅助创作&#xff1a; 《论三生原理》以颠覆传统数学范式的非共识路径驱动多重技术代际跃迁&#xff0c;其突破性实践与争议并存&#xff0c;核心论证如下&#xff1a; 一、技术代际跃迁的实证突破‌ ‌芯片架构革新‌ 为华为三进制逻辑门芯片提供理论支撑&#xff0c;通过对…

一体机电脑为何热度持续上升?消费者更看重哪些功能?

一体机电脑&#xff08;AIO&#xff0c;All-in-One&#xff09;将主机硬件与显示器集成于单一机身。通常仅需连接电源线&#xff0c;配备无线键盘、鼠标即可启用。相比传统台式电脑和笔记本电脑&#xff0c;选购一体机的客户更看重一体机的以下特点。 一体机凭借其节省空间、简…

无人机载重模块技术要点分析

一、技术要点 1. 结构设计创新 双电机卷扬系统&#xff1a;采用主电机&#xff08;张力控制&#xff09;和副电机&#xff08;卷扬控制&#xff09;协同工作&#xff0c;解决绳索缠绕问题&#xff0c;支持30米绳长1.2m/s高速收放&#xff0c;重载稳定性提升。 轴双桨布局…

【大模型推理】工作负载的弹性伸缩

基于Knative的LLM推理场景弹性伸缩方案 1.QPS 不是一个好的 pod autoscaling indicator 在LLM推理中&#xff0c; 为什么 2. concurrency适用于单次请求资源消耗大且处理时间长的业务&#xff0c;而rps则适合较短处理时间的业务。 3.“反向弹性伸缩”的概念 4。 区分两种不同的…

STM32F103_Bootloader程序开发12 - IAP升级全流程

导言 本教程使用正点原子战舰板开发。 《STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader》上一章节实现App跳转bootloader&#xff0c;接着&#xff0c;跳转到bootloader后&#xff0c;下位机要发送报文‘C’给IAP上位机&#xff0c;表示我准备好接收固件数…

AI驱动的未来软件工程范式

引言&#xff1a;迈向智能驱动的软件工程新范式 本文是一份关于构建和实施“AI驱动的全生命周期软件工程范式”的简要集成指南。它旨在提供一个独立、完整、具体的框架&#xff0c;指导组织如何将AI智能体深度融合到软件开发的每一个环节&#xff0c;实现从概念到运维的智能化…