首页 > 解决方案 > 如何使用 UserDefaults.standard 保存自定义数据?

问题描述

我的数据类

import Foundation

class People {

let peopleImage : String
let peopleTime : Int
let peopleName : String

init(image:String, second:Int, name:String) {

    peopleImage = image
    peopleTime = second
    peopleName = name

}

我的数据列表文件

import Foundation

class CustomPeopleList {

    var peopleList = [

        People(image: "Man", second: 12, name: "Andy"),
        People(image: "Woman", second: 60, name: "Kevin"),



    ]

}

我的视图控制器:

let defaults = UserDefaults.standard    
var allPeopleList = CustomPeopleList

有一个按钮,当我单击按钮时,它将删除数据列表中的第一项,但我发现它总是错误。我的用户默认代码是这样的:

self.allPeopleList.remove(at: indexPathTimer.row)
let aaa = self.allPeopleList
let newPeopleData = NSKeyedArchiver.archivedData(withRootObject: self.allPeopleList)
self.defaults.set(aaa, forKey: "myPeopleData")

当我想使用它时

if let peopleData = defaults.data(forKey: "myPeopleData") as? [People] {
allPeopleList = peopleData
}
var allPeopleList = NSKeyedUnarchiver.unarchiveObject(with: peopleData!) as? [Peoples]

xcode说错了

标签: iosswiftnsuserdefaults

解决方案


我推荐该Codable协议并将数据保存为 JSON。它比 Obj-C 相关的更快捷NSKeyed(Un)Archiver

  • 采用协议

    class People : Codable {
    
  • 将数组编码为 JSON 并保存

    do {        
       let newPeopleData = try JSONEncoder().encode(self.allPeopleList)
       self.defaults.set(newPeopleData, forKey: "myPeopleData")
    } catch { print(error)
    
  • 读取数据也很简单

    do {
       if let newPeopleData = self.defaults.data(forKey: "myPeopleData") {
          allPeopleList = try JSONDecoder().decode([People].self, from: newPeopleData)
       }
    } catch { print(error)
    

注意:我会以单数形式命名该类,Person因为 People ( ) 的数组[People]是重言式的,并且要命名属性image,timename


推荐阅读