存储/保存 @State 数组 (UserDefaults)
Posted
技术标签:
【中文标题】存储/保存 @State 数组 (UserDefaults)【英文标题】:Store / Save a @State Array (UserDefaults) 【发布时间】:2020-08-23 13:11:14 【问题描述】:@State var cardData: [Card] = [
Card(number: 1 ,start: "05.06.2020", end: "15.06.2020", days: 10, success: true)
]
我有cardData,用户可以向这个数组添加更多元素。但我希望它会被保存。像用户默认值。是否可以将此(cardData)存储到 UserDefaults? 如果没有,我怎样才能永久保存它? 非常感谢!
【问题讨论】:
UserDefaults 不是为了这个目的,使用 CoreData。 只有CoreData才有可能吗? 你为什么有多个账户? ***.com/questions/63537392/… 我在另一台电脑上 【参考方案1】:有多种方法。 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-新卡))
【讨论】:
好的,谢谢。所以你会推荐我使用 CoreData? 我不完全了解您的情况。如果有很多卡,没有数量限制,你绝对应该使用coredata。否则我已经描述了何时使用 coredata 以及何时可以在答案中使用 userdefaults。如果您仍然不知道该使用哪个,您应该使用 coredata,因为它是安全的方式。 如果你愿意为我做那你想要多少钱? 恐怕我会拒绝你的提议,但我可以建议阅读 Paul Hudson 和 Donny Wals 的 2 篇文章。第一个是制作你的 coredata 模型,第二个是在 SwiftUI 中使用 coredata。我不确定它们是否足以使用 coredata,但它们至少会帮助你。制作核心数据模型:hackingwithswift.com/read/38/2/designing-a-core-data-model。 SwiftUI 与 Coredata 一起使用:donnywals.com/…(这可能有点高级,但至少在您学习了 coredata 之后,您需要阅读它)以上是关于存储/保存 @State 数组 (UserDefaults)的主要内容,如果未能解决你的问题,请参考以下文章
Swift 4,使用 Array 和 TableViewCell 存储和显示数据
如何在 Swift / iOS 中从 UITableView 中删除行并从 UserDefaults 中更新数组