iOS開(kāi)發(fā)之Swift一鍵Encode&Decode + 字典初始化模型

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)")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容