首页 > 解决方案 > 存储/保存 @State 数组 (UserDefaults)

问题描述

@State var cardData: [Card] = [
        Card(number: 1 ,start: "05.06.2020", end: "15.06.2020", days: 10, success: true)
    ]

我有cardData,用户可以向这个数组添加更多元素。但我希望它会被保存。像用户默认值。是否可以将此(cardData)存储到 UserDefaults?如果没有,我怎样才能永久保存它?太感谢了!

标签: arraysswiftswiftui

解决方案


有多种方法。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-新卡))


推荐阅读