Swift中的简单持久存储

用户名

我有一个对象数组,每个对象都有许多属性。这是通过遍历对象数组获取的一些示例数据:

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,然后获取并解码回去。

如果要使用存储对象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

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]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Swift中持久存储对象数组

来自分类Dev

在Swift中持久存储对象数组

来自分类Dev

Core Data和Swift中的计算属性与持久存储

来自分类Dev

Python中的共享持久存储

来自分类Dev

持久存储在kubernetes容器中

来自分类Dev

使用Cassandra在JanusGraph中持久存储

来自分类Dev

持久存储html中的值(javascript)

来自分类Dev

如何在NeDB中实现持久存储?

来自分类Dev

使用OS.File在文件中持久存储JSON

来自分类Dev

持久存储在Spark中不起作用

来自分类Dev

如何从Redux持久存储中读取(localstorage)

来自分类Dev

带有Helm的PostgreSQL中的意外持久存储

来自分类Dev

如何在iOS中持久存储信息?

来自分类Dev

如何在FlowDocument段落中持久存储样式信息?

来自分类Dev

如何持久存储NSManagedObjectID?

来自分类Dev

iOS持久存储框架

来自分类Dev

如何持久存储NSManagedObjectID?

来自分类Dev

使用Junit + eclipse将数据持久存储在本地存储Google App引擎中

来自分类Dev

在Jena TDB三重存储中持久存储数据

来自分类Dev

Boost:R树的持久存储?

来自分类Dev

通过卷的docker持久存储

来自分类Dev

PWA持久存储最佳实践

来自分类Dev

CoreData持久存储异步保存

来自分类Dev

如何持久存储追加到全局数组swift的数据2

来自分类Dev

Swift-将启用iCloud的持久存储添加到核心数据

来自分类Dev

是否有一种简单的基于Java的本地方法来持久存储数据?

来自分类Dev

如何将Firebase对象持久存储到iOS中的磁盘上?

来自分类Dev

不使用SQLite在Android中持久存储数组的最佳方法

来自分类Dev

模型实例固定装置未持久存储在数据库中