arrays - 存储/保存 @State 数组 (UserDefaults)
问题描述
@State var cardData: [Card] = [
Card(number: 1 ,start: "05.06.2020", end: "15.06.2020", days: 10, success: true)
]
我有cardData,用户可以向这个数组添加更多元素。但我希望它会被保存。像用户默认值。是否可以将此(cardData)存储到 UserDefaults?如果没有,我怎样才能永久保存它?太感谢了!
解决方案
有多种方法。on 将为.onChange
您的视图添加一个修饰符(在 Xcode 12 上可用,不确定 11):
.onChange(of: cardData) { newValue in
UserDefaults.standard.setValue(newValue, forKey: "Your_UserDefaults_Key")
}
我注意到您正在使用您制作的自定义类型。在这种情况下,您首先需要将所有数据转换为可以保存到 UserDefaults 的某种类型(如字符串,使用可编码,请参阅:https ://www.hackingwithswift.com/example-code/system/how-to-load -and-save-a-struct-in-userdefaults-using-codable )
正如有人提到的,这可能不是将数据保存在持久存储上的最佳方式。如果您计划保存大量数据,并且您并不总是需要所有这些数据(例如,大多数时候您只需要所有卡片中的一张),您不应该使用 UserDefaults,CoreData
而是使用。在我描述的情况下,使用 UserDefaults 效率不高,因为您每次都必须从设备的存储中获取所有数据(您不能要求使用 UserDefaults 只获取所需的一张卡,但您可以使用 CoreData 来做到这一点)。而且,当将数据保存到设备的存储空间时,您必须用一些新数据替换整个旧数据(在 CoreData 中,您只需添加一张卡即可。您无需将 (all-current-cards) 替换为 (所有当前卡+ 1-新卡))
推荐阅读
- php - 如何在php中获取和存储菜单值
- android - 错误的高棉 Unicode 字符串
- charts - ChartJS 缩放/平移限制
- spring-boot - SpringCloud 的 /refresh 对骆驼路线中使用的属性无效
- android - 如何在android中绘制它们之间垂直距离相等的3个按钮?
- macos - 如何在 Mac OS 系统启动时启动 ActiveMq
- java - GWT 编译后 Datanucleus Enhancer error=7
- myob - 有没有办法获取有关用户登录的信息?
- django - 由 ... 启动的线程中的未处理异常,在 cmd 中?
- java - 使用 Put.add() 方法在 HBase 中添加值