ios - 如何使用 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说错了
解决方案
我推荐该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
,time
和name
。
推荐阅读
- java - .antMatchers("/swagger-ui.html").permitAll() 不起作用
- c++ - 在 C++11 中处理毫秒的正确方法是什么
- node.js - 使用命令 ?mute @someone V12.5.3 时出现错误
- flutter - 如何使用共享首选项通过 bloc 方法保存用户选择的语言
- c# - C# 基于增量 For 循环创建变量名称
- visual-studio - Flutter - 无法使用 SizedBox 设置水平 ListView
- php - 在php laravel中过滤json数据
- xslt-1.0 - XSLT 2.0 仅从第一条记录中删除元素
- asp.net-core-mvc - 如何在 mvc core 3.1 中的操作方法名称中允许多个连字符?
- windows - 尝试在 Windows 中从 obj 构建 exe 时无法识别文件格式