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) {
//转换成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 = 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) {
//转换成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)
}
}
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))")
}