Git連接:https://github.com/BBHNation/EncodeModel
/*
* 新加入了Dic轉(zhuǎn)Model的功能,當(dāng)然是使用了Runtime來(lái)獲取dic信息匹配到Model中
*/
作用:
繼承BaseEncodeModel,可以方便的歸檔解檔,不用一行一行寫(xiě)歸檔代碼和解檔屬性配置。
繼承BaseEntity,可以在歸檔解檔前提下實(shí)現(xiàn)字典初始化。
Git中是一個(gè)EncodeModel,作為基類(lèi),可以方便iOS中的Encode和Decode過(guò)程。
源代碼:
import Foundation
class BaseEncodeModel : NSObject, NSCoding {
override init() {}
/// 獲取所有的屬性名字
///
/// - Returns: 返回一個(gè)數(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 //到下一個(gè)循環(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)
}
}
/// 實(shí)例方法,開(kāi)始編碼
///
/// - 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)
}
/// 類(lèi)方法,開(kāi)始解碼
///
/// - Parameter fileName: 文件名字
/// - Return: 返回一個(gè)實(shí)例,可以為空
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)
}
}
使用方法:
- 第一步 需要類(lèi)繼承于BaseEncodeModel
class Demo: BaseEncodeModel {
var name : String = ""
var age : Int = 0
var gender : Bool = false
var content : String = ""
}
- 第二步 設(shè)置實(shí)例屬性,并使用實(shí)例方法來(lái)Encode
let demo = Demo.init()
demo.content = content.text!
demo.age = 22
demo.name = "BBH"
demo.gender = true
demo.archive(fileName: "helloFileName")
- 第三步 使用類(lèi)方法來(lái)Decode
let demo = Demo.unarchive(fileName: "helloFileName") as? Demo
print("name:\(demo?.name ?? ""), age:\(demo?.age ?? 0), gender:\(demo?.gender ?? false)")