存储/保存@State数组(UserDefaults)

时间:2020-08-23 13:11:14

标签: arrays swift swiftui

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

我有cardData,用户可以向此数组添加更多Elements。但我希望它会被保存。像UserDefaults。可以将这个(cardData)存储到UserDefaults吗? 如果没有,我如何将其永久保存? 非常感谢!

1 个答案:

答案 0 :(得分:0)

有多种方法。会在视图中添加.onChange修饰符(在Xcode 12上可用,不确定大约11):

.onChange(of: cardData) { newValue in
           UserDefaults.standard.setValue(newValue, forKey: "Your_UserDefaults_Key")
}

我注意到您使用的是自定义类型。在这种情况下,您首先需要将所有数据转换为可以保存为UserDefaults的Type(例如字符串,使用可编码,请参见:https://www.hackingwithswift.com/example-code/system/how-to-load-and-save-a-struct-in-userdefaults-using-codable

正如某人提到的那样,这可能不是将数据保存在永久性存储中的最佳方法。如果您打算保存大量数据,并且在任何时候都不需要所有这些数据(例如,在大多数情况下,您只需要所有这些卡之一),则不应使用UserDefaults,而应使用{{1 }}。在我描述的情况下,使用UserDefaults效率不高,因为您每次都必须从设备的存储中获取所有数据(您不能要求仅使用UserDefaults获得一张卡,而可以使用CoreData做到这一点)。而且,在将数据保存到设备的存储设备时,您还必须将整个旧数据替换为一些新数据(在CoreData中,您只需再添加一张卡即可。您无需将(all-current-cards)替换为(全部当前卡+ 1张新卡))