變幻莫測:CoreData 中 Transformable 類型面面俱到(六)

在這里插入圖片描述

概述

各位似禿似不禿小碼農們都知道,在蘋果眾多開發平臺中 CoreData 無疑是那個最簡潔、擁有“官方認證”且最具兼容性的數據庫框架。使用它可以讓我們非常方便的搭建出 App 所需要的持久存儲體系。

在這里插入圖片描述

不過,大家是否知道在 CoreData 中還存在一個 Transformable 類型,它到底是個啥?應用場景有哪些?在最新的 SwiftData 中有沒有對應物?對于開發者又有哪些“見雀張羅”的擼碼陷阱和最佳實踐呢?

在本篇博文中,您將學到如下內容:

  • 概述
  • 6. 派生自 NSObject 的自定義類
    • 6.1 為 CoreData 中 Human 基類增加 skill 字段
    • 6.2 實現 Skill 數據結構
  • 總結

本系列文章一共包括將近 3w 枚機智而幽默的文字、詳實的大段代碼示例以及海量圖片,定能讓小伙伴們對 Transformable 類型的“駕馭”更加胸有成竹、勝券在握!

那還等什么呢?讓我們馬上開始 Transformable 大冒險吧!
Let’s go!!!😉


6. 派生自 NSObject 的自定義類

之前我們討論了系統內置類、自定義結構等數據類型對于 Transformable 的支持,接下來,讓我們再聊聊如何穩妥的處理自定義類的轉換。

如若要我們自己的類也安全地支持 Transformable 類型,有兩個條件:

  1. 必須派生自 NSObject 類;
  2. 必須遵守 NSSecureCoding 協議;

下面,我們就來實際擼碼一回,看看具體的步驟是怎樣的。

為了進一步拓展我們英雄和惡棍的戰斗力,我們想為它們增加**技能(Skill)**這一超能力。我們這次希望用類的多態機制來適配不同種類 Human(英雄或惡棍)的 Skill。

6.1 為 CoreData 中 Human 基類增加 skill 字段

俗話說得好:“高樓平地起,基礎不牢地動山搖”,我們首先要為 CoreData 中 Humam 基類增加支持 Skill 的字段:

在這里插入圖片描述

從上圖可以看到,我們主要做了以下幾件事:

  1. 為 Human 托管基類增加 skill 字段,它的類型為 Transformable;
  2. 設置 skill 字段的 Transformer 屬性為 SkillTransformer(待實現);
  3. 設置 skill 字段的 Custom Class 屬性為 Skill(待實現);

這里再啰嗦幾句,Transformable 字段的 Transformer 屬性存放的是該字段實際類型到 Transformable 類型的轉換器,而 Custom Class 則代表該字段的實際類型。

6.2 實現 Skill 數據結構

前面說過,我們希望英雄和惡棍的技能可以利用類的多態性來擴展,所以首先我們創建一個 Skill 抽象基類:

@objc(Skill)
public class Skill: NSObject, NSSecureCoding {let name: Stringinit(name: String) {if type(of: self) == Skill.self {fatalError("Skill 是抽象基類,禁止實例化!")}self.name = namesuper.init()}public class var supportsSecureCoding: Bool { true }public func encode(with coder: NSCoder) {coder.encode(name, forKey: "name")}required public init(coder: NSCoder) {name = coder.decodeObject(of: NSString.self, forKey: "name")! as Stringsuper.init()}
}

在 Skill 抽象基類的實現中,我們有幾點需要注意:

  • 抽象基類應該禁止實例化,因為 Swift 語言本身沒有提供靜態的禁止方法,所以我們只能通過動態判斷來達成;
  • Skill 內部應該存放所有子類共享的數據,比如 name;
  • Skill 需要實現 supportsSecureCoding 屬性并返回 true,表示它支持安全編碼;
  • Skill 應該實現 NSSecureCoding 協議所要求的兩個方法,它們分別被用來做數據的編碼和解碼工作;
  • Skill 的類名稱需要用 @objc 關鍵字將 Swift 的類名暴露給 objc 層,否則運行會提示找不到名為 Skill 的類;

隨后,我們需要分別實現英雄和惡棍的技能,它們應該是 Skill 的子類:

/// 英雄技能
@objc(HeroSkill)
class HeroSkill: Skill {static let glare = HeroSkill(name: "英雄怒視", justicePower: 109, color: .pink)let justicePower: Intlet color: Colorinit(name: String, justicePower: Int, color: Color) {self.justicePower = justicePowerself.color = colorsuper.init(name: name)}override class var supportsSecureCoding: Bool { true }public override func encode(with coder: NSCoder) {coder.encode(justicePower, forKey: "justicePower")let uiColor = UIColor(color)coder.encode(uiColor, forKey: "uiColor")super.encode(with: coder)}required public init(coder: NSCoder) {justicePower = coder.decodeInteger(forKey: "justicePower")let uiColor = coder.decodeObject(of: UIColor.self, forKey: "uiColor")!color = Color(uiColor: uiColor)super.init(coder: coder)}
}/// 惡棍技能
@objc(VillainSkill)
class VillainSkill: Skill {static let swallow = VillainSkill(name: "惡棍吞咽", evalPower: 121)let evalPower: Intinit(name: String, evalPower: Int) {self.evalPower = evalPowersuper.init(name: name)}override class var supportsSecureCoding: Bool { true }public override func encode(with coder: NSCoder) {coder.encode(evalPower, forKey: "evalPower")super.encode(with: coder)}required public init(coder: NSCoder) {evalPower = coder.decodeInteger(forKey: "evalPower")super.init(coder: coder)}
}

對于上面 HeroSkill 和 VillainSkill 兩個子類,我們實現了它們各自具體的數據編碼和解密功能,并為它們分別創建了一個實例(glare 和 swallow)。

回想一下,之前我們為 Human.skill 字段的 Custom Class 設置的是 Skill 基類,而不是具體的子類,這意味著具體 Skill 子類的編碼和解密工作都會由系統自動幫你搞定,真是妙哉妙哉!

在下一篇博文中,我們將繼續完成 Skill 到 Transformable 類型的轉換,等著你們哦!

總結

在本篇博文中,我們初步介紹了派生自 NSObject 的自定義類如何支持 Transformable 的轉換,你值得擁有!

感謝觀賞,我們下一篇再會啦!😎

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85603.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85603.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85603.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vuex(一) —— 集中式的狀態管理倉庫

目錄 Vue組件間通信方式回顧 組件內的狀態管理流程組件間通信方式 父組件給子組件傳值 (最簡單的一種方式)子組件給父組件傳值不相關組件之間傳值其他常見方式($ref) 簡易的狀態管理方案 上面組件間通信方式的問題集中式的狀態管理方案 Vuex 什么是Vuex?什么情況下使用Vuex?…

操作系統---內存管理上

文章目錄 1. 內存的基礎知識1.1 什么是內存,有何作用1.2 進程運行的基本原理1.2.1 指令的工作原理1.2.2 邏輯地址 VS 物理地址 1.3 如何實現地址轉換(邏輯 -> 物理)1.3.1 絕對裝入1.3.2 可重定位裝入(靜態重定位)1.…

醫學圖像處理期末復習

目錄 考試范圍第1章 緒論1.1 數字圖像處理的概念1.2 數字圖像處理的應用領域1、醫學領域2、其他領域 1.3 數字圖像處理基礎1.4 數字圖像基礎運算 第2章 醫學圖像灰度變換與空間濾波2.1 醫學圖像灰度變換線性灰度變換非線性灰度變換 2.2 直方圖均衡化√2.3 空間平滑濾波線性空間…

類圖:軟件世界的“建筑藍圖”

本文來自「大千AI助手」技術實戰系列,專注用真話講技術,拒絕過度包裝。 類圖(Class Diagram):軟件世界的“建筑藍圖” 類圖(Class Diagram)是統一建模語言(UML) 中最重要…

利用DevEco Studio對RK3588的HiHopesOS-4.1.110(OpenHarmony)進行Qt程序編寫

文章目錄 熱身準備添加Qt庫運行qml程序 熱身 可以先看我這篇文章【DevEco Studio中使用Qt,編寫HarmonyOS程序】 準備 板子的主要信息 目前由于系統版本(API 11)及其他原因,只能用4.1版本的DevEcoStudio來編寫,更高…

設計模式精講 Day 5:原型模式(Prototype Pattern)

【設計模式精講 Day 5】原型模式(Prototype Pattern) 文章內容 在“設計模式精講”系列的第5天,我們將深入講解原型模式(Prototype Pattern)。作為創建型設計模式之一,原型模式通過復制已有對象來創建新對…

深度學習——第2章習題2-1分析為什么平方損失函數不適用于分類問題

深度學習——第2章習題2-1 《神經網絡與深度學習》——邱錫鵬 2-1 分析為什么平方損失函數不適用于分類問題。 平方損失函數(Quadratic Loss Function)經常用在預測標簽y為實數值的任務中,定義為 L ( y , f ( x ; θ ) ) 1 2 ( y ? f (…

【Linux】運行腳本后打屏同時保存到本地

命令: sh run.sh 2>&1 | tee output.log sh run.sh 2>&1 | tee output_$(date "%Y%m%d%H%M").log作用:運行腳本,并同時將輸出(包括標準輸出和錯誤輸出)顯示到終端,并保存到文件中…

Spark 在小眾日常場景中的實戰應用:從小店數據到社區活動

Spark 在小眾日常場景中的實戰應用:從小店數據到社區活動? 提起 Spark,大家往往會聯想到大型互聯網公司的數據處理、金融行業的復雜分析。但實際上,Spark 在許多小眾、貼近生活的場景中也能大顯身手。結合學習與實踐,我探索了 S…

mysql 執行計劃 explain命令 詳解

explain id :select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序select_type:查詢類型 或者是 其他操作類型table :正在訪問哪個表partitions :匹配的分區type :訪問的類…

讓大模型“更懂人話”:對齊訓練(RLHF DPO)全流程實戰解析

網羅開發 (小紅書、快手、視頻號同名) 大家好,我是 展菲,目前在上市企業從事人工智能項目研發管理工作,平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術,包括iOS、前端、Harmony OS、Java、Python等…

GO 原子操作面試題及參考答案

Go 的 sync/atomic 包和 sync.Mutex 的根本區別是什么? Go 語言中的 sync/atomic 包和 sync.Mutex 都用于處理并發編程中的同步問題,但它們的實現機制、應用場景和性能特性存在根本差異。理解這些差異對于編寫高效、安全的并發代碼至關重要。 sync/atomi…

MATLAB 山脊圖繪制全解析:從數據生成到可視化進階

一、引言:當數據分布擁有「層次感」—— 山脊圖的魅力? 在數據可視化的世界里,我們常常需要同時展示多個分布的形態差異。傳統的重疊密度圖雖然能呈現整體趨勢,但當分布數量較多時,曲線交疊會讓畫面變得雜亂。這時候&#xff0c…

跨境電商每周資訊—6.16-6.20

1. Instagram 在亞太地區逐漸超越 TikTok 在整個亞太地區,Instagram用戶數量正逐漸超過TikTok。預計2025年日本Instagram用戶數量將增至4440萬,印度今年用戶數量將增長10%,領跑亞太。與之形成對比的是,TikTok在一些國家增長速度放…

計算機網絡 網絡層:數據平面(一)

前一節學習了運輸層依賴于網絡層的主機到主機的通信服務,提供各種形式的進程到進程的通信。了解這種主機到主機通信服務的真實情況,是什么使得它工作起來的。 在本章和下一章,將學習網絡層實際是怎樣實現主機到主機的通信服務。與運輸層和應用…

Suna本地部署詳細教程

一、安裝基礎環境 # 1、創建環境 conda create -n suna python3.11.7# 2、激活虛擬環境 conda activate suna# 3、安裝jupyter和ipykernel pip install jupyter ipykernel# 4、將虛擬環境添加到jupyter # python -m ipykernel install --user --namemyenv --display-name"…

LeetCode 每日一題打卡|若谷的刷題日記 3day--最長連續序列

1.最長連續序列 題目: 給定一個未排序的整數數組 nums ,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。 請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 1: 輸入:nums [1…

EfficientVLA:面向視覺-語言-動作模型無訓練的加速與壓縮

25年6月來自上海交大、哈工大、西安交大和電子科大(成都)的論文“EfficientVLA: Training-Free Acceleration and Compression for Vision-Language-Action Models”。 視覺-語言-動作 (VLA) 模型,特別是基于擴散的架構,展現出具…

wireshark抓包分析TCP數據包

1、直接從TCP的三次握手開始說起 三次握手就是客戶與服務器建立連接的過程 客戶向服務器發送SYN(SEQ=x)報文,然后就會進入SYN_SEND狀態服務器收到SYN報文之后,回應一個SYN(SEQ=y)ACK(ACK=x+1)報文,然后就會進入SYN_RECV狀態客戶收到服務器的SYN報文,回應一個ACK(AC…

同等學力申碩-計算機統考-歷年真題和備考經驗

同等學力申請碩士學位考試是比較適合在職人員的提升學位方式,了解過的人應該都知道,現在社會的競爭壓力越來越大,為了提高職業生存能力,提升學位在所難免。 一、已有計算機統考歷年真題資料 報名過同等學力申碩計算機專業的朋友都…