我有一个对象数组,每个对象都有许多属性。这是通过遍历对象数组获取的一些示例数据:
Name = Rent Default Value 750 This Months Estimate = 750 Sum Of This Months Actuals = 0 Risk Factor = 0.0 Monthly Average = 750.0 -------------- Name = Bills Default Value 250 This Months Estimate = 170 Sum Of This Months Actuals = 140 Risk Factor = 0.0 Monthly Average = 190.0 -------------- Name = Food Default Value 240 This Months Estimate = 200 Sum Of This Months Actuals = 95 Risk Factor = 0.0 Monthly Average = 190.0 -------------- Name = Lunches Default Value 100 This Months Estimate = 150 Sum Of This Months Actuals = 155 Risk Factor = 0.899999976158142 Monthly Average = 190.0
它的数据很少,所以我想避免使用核心数据。我需要能够持久保存数组,然后再次打开它并能够遍历它。我希望使用一个简单的解决方案,例如NSUserDefaults或NSKeyedArchiver,但是在Swift中我无法使用这种类型的数组(我已经在线阅读文档,论坛和示例了24小时……)
您将如何建议我像上面那样持久保存对象数组?还是坚持保存这种类型的数组是不好的做法?
在此先感谢您的帮助!
添加对象类:
class costCategory : NSObject { var name : String var defaultValue : Int var thisMonthsEstimate : Int var sumOfThisMonthsActuals : Int var riskFactor : Float var monthlyAverage : Float init (name:String, defaultValue:Int, thisMonthsEstimate:Int, sumOfThisMonthsActuals:Int, riskFactor:Float, monthlyAverage:Float) { self.name = name self.defaultValue = defaultValue self.thisMonthsEstimate = thisMonthsEstimate self.sumOfThisMonthsActuals = sumOfThisMonthsActuals self.riskFactor = riskFactor self.monthlyAverage = monthlyAverage } }
如果我尝试将数组保存到NSUserDefaults,则会收到错误消息:
Property list invalid for format: 200 (property lists cannot contain objects of type 'CFType')
我尝试使用从NSCoder类继承的方法,但是出现了我无法解决的错误,如下所示:
class costCategory : NSObject, NSCoder { var name : String var defaultValue : Int var thisMonthsEstimate : Int var sumOfThisMonthsActuals : Int var riskFactor : Float var monthlyAverage : Float init (name:String, defaultValue:Int, thisMonthsEstimate:Int, sumOfThisMonthsActuals:Int, riskFactor:Float, monthlyAverage:Float) { self.name = name self.defaultValue = defaultValue self.thisMonthsEstimate = thisMonthsEstimate self.sumOfThisMonthsActuals = sumOfThisMonthsActuals self.riskFactor = riskFactor self.monthlyAverage = monthlyAverage } // MARK: NSCoding required convenience init(coder decoder: NSCoder) { self.init() //Error here "missing argument for parameter name in call self.name = decoder.decodeObjectForKey("name") as String self.defaultValue = decoder.decodeIntegerForKey("defaultValue") self.thisMonthsEstimate = decoder.decodeIntegerForKey("thisMonthsEstimate") self.sumOfThisMonthsActuals = decoder.decodeIntegerForKey("sumOfThisMonthsActuals") self.riskFactor = decoder.decodeFloatForKey("riskFactor") self.monthlyAverage = decoder.decodeFloatForKey("monthlyAverage") } func encodeWithCoder(coder: NSCoder) { coder.encodeObject(self.name, forKey: "name") coder.encodeInt(Int32(self.defaultValue), forKey: "defaultValue") coder.encodeInt(Int32(self.thisMonthsEstimate), forKey: "thisMonthsEstimate") coder.encodeInt(Int32(self.sumOfThisMonthsActuals), forKey: "sumOfThisMonthsActuals") coder.encodeFloat(self.riskFactor, forKey: "riskFactor") coder.encodeFloat(self.monthlyAverage, forKey: "monthlyAverage") } }
一种可能性是将对象的property:values转换为string:object将它们存储到NSUserDefaults,然后获取并解码回去。
NSUserDefaults
如果要使用存储对象NSKeyedArchiver,则您的类需要符合NSCoding并成为的子类NSObject。例:
NSKeyedArchiver
NSCoding
NSObject
class costCategory : NSObject, NSCoding { var name : String var defaultValue : Int var thisMonthsEstimate : Int var sumOfThisMonthsActuals : Int var riskFactor : Float var monthlyAverage : Float init (name:String, defaultValue:Int, thisMonthsEstimate:Int, sumOfThisMonthsActuals:Int, riskFactor:Float, monthlyAverage:Float) { self.name = name self.defaultValue = defaultValue self.thisMonthsEstimate = thisMonthsEstimate self.sumOfThisMonthsActuals = sumOfThisMonthsActuals self.riskFactor = riskFactor self.monthlyAverage = monthlyAverage } // MARK: NSCoding required init(coder decoder: NSCoder) { //Error here "missing argument for parameter name in call self.name = decoder.decodeObjectForKey("name") as String self.defaultValue = decoder.decodeIntegerForKey("defaultValue") self.thisMonthsEstimate = decoder.decodeIntegerForKey("thisMonthsEstimate") self.sumOfThisMonthsActuals = decoder.decodeIntegerForKey("sumOfThisMonthsActuals") self.riskFactor = decoder.decodeFloatForKey("riskFactor") self.monthlyAverage = decoder.decodeFloatForKey("monthlyAverage") super.init() } func encodeWithCoder(coder: NSCoder) { coder.encodeObject(self.name, forKey: "name") coder.encodeInt(Int32(self.defaultValue), forKey: "defaultValue") coder.encodeInt(Int32(self.thisMonthsEstimate), forKey: "thisMonthsEstimate") coder.encodeInt(Int32(self.sumOfThisMonthsActuals), forKey: "sumOfThisMonthsActuals") coder.encodeFloat(self.riskFactor, forKey: "riskFactor") coder.encodeFloat(self.monthlyAverage, forKey: "monthlyAverage") } }
然后,您可以存档并保存到NSDefaults:
NSDefaults
let defaults = NSUserDefaults.standardUserDefaults() let arrayOfObjectsKey = "arrayOfObjectsKey" var arrayOfObjects = [costCategory]() var arrayOfObjectsData = NSKeyedArchiver.archivedDataWithRootObject(arrayOfObjects) defaults.setObject(arrayOfObjectsData, forKey: arrayOfObjectsKey) // ... var arrayOfObjectsUnarchivedData = defaults.dataForKey(arrayOfObjectsKey)! var arrayOfObjectsUnarchived = NSKeyedUnarchiver.unarchiveObjectWithData(arrayOfObjectsUnarchivedData) as [costCategory]