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