iOS,Swift:如何保存包含自定义对象的数组以便我可以加载以供重用?
Posted
技术标签:
【中文标题】iOS,Swift:如何保存包含自定义对象的数组以便我可以加载以供重用?【英文标题】:iOS, Swift: How to save an array that contains custom objects so that I can be loaded for reuse? 【发布时间】:2017-12-05 04:59:22 【问题描述】:我有一个包含我创建的对象的数组。我希望管理器类从磁盘加载这个数组,以便我可以继续追加到数组。
---这是我想要管理加载数组的类
class FoodManager
var foodList : [FoodItem]
func addFood(name : String, carbs : Int, fat: Int, protein : Int)
let food = FoodItem(name: name, carbs: carbs, protein: protein, fat: fat)
foodList.append(food)
init()
foodList = [FoodItem]()
//Here is where I would like to load the array to initialize foodList or if the file doesn't exist, create a new array
-----这是数组中的类----
class FoodItem
let name: String
let carbs: Int
let protein: Int
let fat: Int
init(name: String, carbs: Int, protein: Int, fat: Int)
self.name = name
self.carbs = carbs
self.protein = protein
self.fat = fat
我找到了很多关于保存只有原始数据类型的类的信息,但在查找需要保存用户定义对象数组的示例时遇到了麻烦。
谢谢!
【问题讨论】:
见developer.apple.com/documentation/swift/… 【参考方案1】:如果您想保存自定义类以供重复使用,这将是您的自定义类的实现。
class FoodItem: NSCoding
let name: String?
let carbs: Int?
let protein: Int?
let fat: Int?
required init(name: String, carbs: Int, protein: Int, fat: Int)
self.name = name
self.carbs = carbs
self.protein = protein
self.fat = fat
func encode(with aCoder: NSCoder)
aCoder.encode(name, forKey: "name")
aCoder.encode(carbs, forKey: "carbs")
aCoder.encode(protein, forKey: "protein")
aCoder.encode(fat, forKey: "fat")
required init(coder aDecoder: NSCoder)
self.name = aDecoder.decodeObject(forKey : "name") as? String
self.carbs = aDecoder.decodeObject(forKey : "carbs") as? Int
self.protein = aDecoder.decodeObject(forKey : "protein") as? Int
self.fat = aDecoder.decodeObject(forKey : "fat") as? Int
要将此类对象保存到用户默认值中,您可以使用:
let userDefaults = UserDefaults.standard
let encodedData = NSKeyedArchiver.archivedData(withRootObject: YourObjectToSave)
userDefaults.set(encodedData, forKey: "DummyName")
userDefaults.synchronize()
要从 userdefaults 中取回对象,您可以使用:
let decoded = UserDefaults.standard.object(forKey: "DummyName") as! NSData
let decodedClassObject = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! FoodItem
编辑:
保存 FoodItems 数组:
假设我有一个 FoodItems 数组:
let itemArray: [FoodItem] = [item1, item2, item3]
您现在也可以使用相同的代码来保存此数组:
let userDefaults = UserDefaults.standard
let encodedData = NSKeyedArchiver.archivedData(withRootObject: YourObjectToSave)
userDefaults.set(encodedData, forKey: "itemArray")
userDefaults.synchronize()
现在检索数组:
let decoded = UserDefaults.standard.object(forKey: "itemArray") as! NSData
let decodedClassObject = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! [FoodItem]
【讨论】:
请勿使用UserDefaults
保存数据。
感谢您的回复,但它仍然没有回答我的问题。我或多或少地了解如何保存一个对象。我想做的是保存一个包含许多 FoodItem 对象的数组。
@nimak:我添加了保存自定义对象数组的代码。
感谢@amrit sidhu 的重播。我最终做了类似的事情。【参考方案2】:
您需要使用 NSCoder 类将自定义对象数组保存在您的管理器类中。
【讨论】:
从到目前为止我用 nscoder 研究的内容来看,数组中的对象需要扩展吗? NSCoder 协议?经理类是否也需要这样做,还是只处理加载和保存...谢谢 我使用 NSCoder 协议解决了这个问题。谢谢萨希尔!以上是关于iOS,Swift:如何保存包含自定义对象的数组以便我可以加载以供重用?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?