Swift class和struct的解歸檔

NSCoding

這種方式是OC中就有的晋控,比較老的方式损趋,并且使用限制是只能是calss,然后實現(xiàn)NSCoding术幔,對于struct是不能使用的。

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)
        }
    }

利用運行時設(shè)置好屬性梯影,這樣又多了一層限制巫员,必須繼承NSObject,因為運行時只有繼承NSObject才會具備。如果不介意手動一行一行設(shè)置屬性甲棍,那大可不繼承NSObject简识。

static func saveCustomObject(customObject object: NSCoding, key: String) {
        let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object)
        self.userDefaults.set(encodedObject, forKey: key)
        self.userDefaults.synchronize()
    }
    
    static func removeCustomObject(key: String) {
        self.userDefaults.removeObject(forKey: key)
    }
    
    static func getCustomObject(forKey key: String) -> Any? {
        if let decodedObject = self.userDefaults.object(forKey: key), let data = decodedObject as? Data {
            let object = NSKeyedUnarchiver.unarchiveObject(with: data)
            return object
        }
        return nil
    }

這樣就把class歸檔,解檔做好了感猛,對于struct的歸檔必須使用取巧的方式參考這里或者這里面,NSCoding只適用于class,系統(tǒng)并沒有提供專門的針對struct的解歸檔的協(xié)議.

Swift4.0后Codable

Swift4.0后解歸檔就變得容易多了Codable七扰,這個協(xié)議對于class或是struct都適用,并且使用起來很簡單方便陪白。

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"
}

定義class和struct,只要聲明實現(xiàn)Codable協(xié)議颈走,不需要做額外的其他操作,比如不需要手動添加設(shè)置解歸檔的key等等咱士。系統(tǒng)都會幫你搞定立由。不過需要注意的是Codable并不支持繼承方式的子類解歸檔,也就是如果ClassC繼承ClassA,如果對ClassC解歸檔時不會成功的,也就是說Codable不能夠被繼承使用序厉,所以只能在子類實現(xiàn)Codable,父類不去實現(xiàn)Codable锐膜。

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))")
        }

這樣就搞定了,關(guān)于Codable的詳細介紹可以參考這里這里弛房。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末道盏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庭再,更是在濱河造成了極大的恐慌捞奕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拄轻,死亡現(xiàn)場離奇詭異颅围,居然都是意外死亡,警方通過查閱死者的電腦和手機恨搓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門院促,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筏养,“玉大人,你說我怎么就攤上這事常拓〗ト埽” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵弄抬,是天一觀的道長茎辐。 經(jīng)常有香客問我,道長掂恕,這世上最難降的妖魔是什么拖陆? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮懊亡,結(jié)果婚禮上依啰,老公的妹妹穿的比我還像新娘。我一直安慰自己店枣,他們只是感情好速警,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸯两,像睡著了一般闷旧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钧唐,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天鸠匀,我揣著相機與錄音,去河邊找鬼逾柿。 笑死缀棍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的机错。 我是一名探鬼主播爬范,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弱匪!你這毒婦竟也來了青瀑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萧诫,失蹤者是張志新(化名)和其女友劉穎斥难,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帘饶,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡哑诊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了及刻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镀裤。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡竞阐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出暑劝,到底是詐尸還是另有隱情骆莹,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布担猛,位于F島的核電站幕垦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏傅联。R本人自食惡果不足惜智嚷,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纺且。 院中可真熱鬧,春花似錦稍浆、人聲如沸载碌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫁艇。三九已至,卻和暖如春弦撩,著一層夾襖步出監(jiān)牢的瞬間步咪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工益楼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猾漫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓感凤,卻偏偏與公主長得像悯周,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子陪竿,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉禽翼,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,725評論 0 9
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,160評論 30 470
  • Swift2.0 1.defer譯為延緩、推遲之意類似棧 注意作用域族跛,其次是調(diào)用順序——即一個作用域結(jié)束(注意)闰挡,...
    zeqinjie閱讀 3,382評論 0 50
  • 如今,誰要是沒聽說過互聯(lián)網(wǎng)+礁哄,肯定會死在今天的晚上长酗。 行業(yè)描述 2014年我國經(jīng)常參加體育鍛煉的人數(shù)達到4.1億,...
    劉明學(xué)閱讀 549評論 0 1
  • 無戒365極限挑戰(zhàn)日更營第4天 文:木子羅 這些日子桐绒,天頂漸漸的高了花枫,云也漸漸的淡了刻盐,連天空的藍色也透亮了,變成一...
    木子羅閱讀 689評論 18 32