Git連接:https://github.com/BBHNation/EncodeModel
/*
* 新加入了Dic轉(zhuǎn)Model的功能谍咆,當(dāng)然是使用了Runtime來獲取dic信息匹配到Model中
*/
作用:
繼承BaseEncodeModel他膳,可以方便的歸檔解檔,不用一行一行寫歸檔代碼和解檔屬性配置。
繼承BaseEntity喝噪,可以在歸檔解檔前提下實現(xiàn)字典初始化。
Git中是一個EncodeModel啼染,作為基類琢岩,可以方便iOS中的Encode和Decode過程投剥。
源代碼:
import Foundation
class BaseEncodeModel : NSObject, NSCoding {
override init() {}
/// 獲取所有的屬性名字
///
/// - Returns: 返回一個數(shù)組,帶有屬性名字
func getPropertyNameList() -> [String] {
var count : UInt32 = 0
var names : [String] = []
let properties = class_copyPropertyList(type(of: self), &count)
guard let propertyList = properties else { return [] }
for i in 0..<count {
let property = propertyList[Int(i)]
guard let char_b = property_getName(property) else {
continue //到下一個循環(huán)
}
if let key = NSString(cString: char_b, encoding: String.Encoding.utf8.rawValue) as String? {
names.append(key)
}
}
return names
}
/// 協(xié)議方法
///
/// - Parameter aCoder: 編碼
func encode(with aCoder: NSCoder) {
let propertyList = getPropertyNameList()
for p_name in propertyList {
aCoder.encode(value(forKey: p_name), forKey: p_name)
}
print("encode successful")
}
/// 協(xié)議方法
///
/// - Parameter aDecoder: 解碼
required init?(coder aDecoder: NSCoder) {
super.init()
let propertyList = getPropertyNameList()
for p_name in propertyList {
let value = aDecoder.decodeObject(forKey: p_name)
setValue(value, forKey: p_name)
}
}
/// 實例方法担孔,開始編碼
///
/// - Parameter fileName: 文件名字
func archive(fileName: String) {
let filePath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!
let savePath = filePath + "/" + fileName + ".plist"
NSKeyedArchiver.archiveRootObject(self, toFile: savePath)
}
/// 類方法江锨,開始解碼
///
/// - Parameter fileName: 文件名字
/// - Return: 返回一個實例,可以為空
static func unarchive(fileName: String) -> Any? {
let filePath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!
let savePath = filePath + "/" + fileName + ".plist"
return NSKeyedUnarchiver.unarchiveObject(withFile: savePath)
}
}
使用方法:
- 第一步 需要類繼承于BaseEncodeModel
class Demo: BaseEncodeModel {
var name : String = ""
var age : Int = 0
var gender : Bool = false
var content : String = ""
}
- 第二步 設(shè)置實例屬性糕篇,并使用實例方法來Encode
let demo = Demo.init()
demo.content = content.text!
demo.age = 22
demo.name = "BBH"
demo.gender = true
demo.archive(fileName: "helloFileName")
- 第三步 使用類方法來Decode
let demo = Demo.unarchive(fileName: "helloFileName") as? Demo
print("name:\(demo?.name ?? ""), age:\(demo?.age ?? 0), gender:\(demo?.gender ?? false)")