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 4 如何将自定义对象数组转换为 JSON

如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?

从数组中删除自定义对象 (Swift)