日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift class和struct的解归档

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift class和struct的解归档 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

NSCoding

這種方式是OC中就有的,比較老的方式,并且使用限制是只能是calss,然后實現NSCoding,對于struct是不能使用的。

internal func encode(with aCoder: NSCoder) {var count :UInt32 = 0if let ivar = class_copyIvarList(self.classForCoder, &count) {for i in 0..<Int(count) {let iv = ivar[i]//獲取成員變量的名稱 -> c語言字符串if let cName = ivar_getName(iv) {//轉換成String字符串guard let strName = String(cString: cName, encoding: String.Encoding.utf8) else{//繼續下一次遍歷continue}//利用kvc 取值let value = self.value(forKey: strName)aCoder.encode(value, forKey: strName)}}// 釋放c 語言對象free(ivar)}}internal required init?(coder aDecoder: NSCoder) {super.init()var count :UInt32 = 0if let ivar = class_copyIvarList(self.classForCoder, &count) {for i in 0..<Int(count) {let iv = ivar[i]//獲取成員變量的名稱 -》 c語言字符串if let cName = ivar_getName(iv) {//轉換成String字符串guard let strName = String(cString: cName, encoding: String.Encoding.utf8) else{//繼續下一次遍歷continue}//進行解檔取值let value = aDecoder.decodeObject(forKey: strName)//利用kvc給屬性賦值setValue(value, forKeyPath: strName)}}// 釋放c 語言對象free(ivar)}} 復制代碼

利用運行時設置好屬性,這樣又多了一層限制,必須繼承NSObject,因為運行時只有繼承NSObject才會具備。如果不介意手動一行一行設置屬性,那大可不繼承NSObject。

static func saveCustomObject(customObject object: NSCoding, key: String) {let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object)self.userDefaults.set(encodedObject, forKey: key)self.userDefaults.synchronize()}static func removeCustomObject(key: String) {self.userDefaults.removeObject(forKey: key)}static func getCustomObject(forKey key: String) -> Any? {if let decodedObject = self.userDefaults.object(forKey: key), let data = decodedObject as? Data {let object = NSKeyedUnarchiver.unarchiveObject(with: data)return object}return nil} 復制代碼

這樣就把class歸檔,解檔做好了,對于struct的歸檔必須使用取巧的方式參考這里或者這里面,NSCoding只適用于class,系統并沒有提供專門的針對struct的解歸檔的協議.

Swift4.0后Codable

Swift4.0后解歸檔就變得容易多了Codable,這個協議對于class或是struct都適用,并且使用起來很簡單方便。

class ClassA: Codable {private var message : String? = "message"private var nu : String? = "nu"private var condition : String? = "condition"var com : String? = "com"var status : String? = "status"var state : String? = "state"var data : [ClassB]? = [] }struct ClassB: Codable{var time : String? = "time"var ftime : String? = "ftime"var context : String? = "context"var location : String? = "location" } 復制代碼

定義class和struct,只要聲明實現Codable協議,不需要做額外的其他操作,比如不需要手動添加設置解歸檔的key等等。系統都會幫你搞定。不過需要注意的是Codable并不支持繼承方式的子類解歸檔,也就是如果ClassC繼承ClassA,如果對ClassC解歸檔時不會成功的,也就是說Codable不能夠被繼承使用,所以只能在子類實現Codable,父類不去實現Codable。

let a = ClassA()let b = ClassB()a.data = [b]//歸檔let encoder = JSONEncoder()if let data = try? encoder.encode(a) {print(String(data: data, encoding: .utf8)!)UserDefaults.standard.set(data, forKey: "piaojin")}let object = UserDefaults.standard.object(forKey: "piaojin")//解檔let decoder = JSONDecoder()if let data = object as? Data {let objectA = try? decoder.decode(ClassA.self, from: data)print("\(String(describing: objectA))")} 復制代碼

這樣就搞定了,關于Codable的詳細介紹可以參考這里和這里。

總結

以上是生活随笔為你收集整理的Swift class和struct的解归档的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。