Swift class和struct的解归档
生活随笔
收集整理的這篇文章主要介紹了
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的解归档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 酷客多小程序实现小程序之间跳转功能,让小
- 下一篇: 如何在SQL Server数据库中加密数