第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Swift 3從userDefaults保存和檢索自定義對象

Swift 3從userDefaults保存和檢索自定義對象

瀟瀟雨雨 2019-10-16 14:53:24
我在Playground中使用Swift 3,Xcode 8.0擁有此功能:import Foundationclass Person: NSObject, NSCoding {    var name: String    var age: Int    init(name: String, age: Int) {        self.name = name        self.age = age    }    required convenience init(coder aDecoder: NSCoder) {        let name = aDecoder.decodeObject(forKey: "name") as! String        let age = aDecoder.decodeObject(forKey: "age") as! Int        self.init(            name: name,            age: age        )    }    func encode(with aCoder: NSCoder) {        aCoder.encode(name, forKey: "name")        aCoder.encode(age, forKey: "age")    }}創(chuàng)建人員數(shù)組let newPerson = Person(name: "Joe", age: 10)var people = [Person]()people.append(newPerson)編碼數(shù)組let encodedData = NSKeyedArchiver.archivedData(withRootObject: people)print("encodedData: \(encodedData))")保存到用戶默認(rèn)值let userDefaults: UserDefaults = UserDefaults.standard()userDefaults.set(encodedData, forKey: "people")userDefaults.synchronize()校驗print("saved object: \(userDefaults.object(forKey: "people"))")從userDefaults返回if let data = userDefaults.object(forKey: "people") {    let myPeopleList = NSKeyedUnarchiver.unarchiveObject(with: data as! Data)    print("myPeopleList: \(myPeopleList)")}else{    print("There is an issue")}只需檢查存檔的數(shù)據(jù)if let myPeopleList = NSKeyedUnarchiver.unarchiveObject(with: encodedData){   print("myPeopleList: \(myPeopleList)")}else{   print("There is an issue")}我無法正確將數(shù)據(jù)對象保存到userDefaults,此外,底部的檢查還會產(chǎn)生錯誤“嚴(yán)重錯誤:在展開可選值時意外發(fā)現(xiàn)nil”。“檢查”行還顯示已保存的對象為nil。這是我對象的NSCoder中的錯誤嗎?
查看完整描述

3 回答

?
慕妹3242003

TA貢獻(xiàn)1824條經(jīng)驗 獲得超6個贊

let age = aDecoder.decodeObject(forKey: "age") as! Int

Swift 3對此進(jìn)行了更改;這不再適用于值類型?,F(xiàn)在正確的語法是:


let age = aDecoder.decodeInteger(forKey: "age")

有針對各種不同類型的關(guān)聯(lián)的encode ...()函數(shù):


let myBool = aDecoder.decodeBoolean(forKey: "myStoredBool")

let myFloat = aDecoder.decodeFloat(forKey: "myStoredFloat")

編輯:Swift 3中所有可能的encodeXXX函數(shù)的完整列表


編輯:


另一個重要的注意事項:如果您以前保存過使用較早版本的Swift編碼的數(shù)據(jù),則必須使用encodeObject()解碼這些值,但是一旦使用encode(...)重新編碼數(shù)據(jù),就不能再使用如果它是值類型,則使用decodeObject()解碼。因此,Markus Wyss的答案將允許您處理使用兩種Swift版本對數(shù)據(jù)進(jìn)行編碼的情況:


self.age = aDecoder.decodeObject(forKey: "age") as? Int ?? aDecoder.decodeInteger(forKey: "age")


查看完整回答
反對 回復(fù) 2019-10-16
  • 3 回答
  • 0 關(guān)注
  • 877 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號