【问题标题】:Converting Swift Array to NSData for NSUserDefaults.StandardUserDefaults persistent storage将 Swift 数组转换为 NSData 用于 NSUserDefaults.StandardUserDefaults 持久存储
【发布时间】:2014-12-01 05:15:29
【问题描述】:

我正在尝试通过制作一个小型应用程序来了解 Swift(在对 Obj-C 相对胜任之后)。我想使用 NSUserDefaults 来持久保存少量数据,但我遇到了问题。

我像这样初始化一个空的元组数组:

var costCategoryArray: [(name:String, defaultValue:Int, thisMonthsEstimate:Int, sumOfThisMonthsActuals:Int, riskFactor:Float, monthlyAverage:Float)]=[]

当数组有条目时,我想使用标准 Swift 代码将数组保存到 NSUserDefaults,例如:

NSUserDefaults.standardUserDefaults().setObject(costCategoryArray, forKey: "financialData")
NSUserDefaults.standardUserDefaults().synchronize()

我收到一条错误消息,指出元组数组不符合 AnyObject 类。于是我试着把它变成了NSData:

var myNSData: NSData = NSKeyedArchiver.archivedDataWithRootObject(costCategoryArray)
var myUnarchivedData: Array = NSKeyedUnarchiver.unarchiveObjectWithData(myNSData)

...但是在转换为 NSData 的过程中我遇到了同样的错误。我的数组持有的对象不符合 AnyObject。我还尝试在每个阶段使用以下方法使其不可变:

let immutableArray = costCategoryArray

我也尝试过创建一个类而不是使用我理解的元组,这会使其符合 AnyObject:

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
    }
}

但新的错误是:

“属性列表格式无效:200(属性列表不能包含'CFType'类型的对象)”

元组数组有什么问题?为什么我不能存储类对象数组?我觉得我需要一些专家的建议,因为到目前为止我尝试用 Swift 做的所有事情都几乎不兼容......

谢谢!

【问题讨论】:

  • 真的吗?没有人可以帮助将对象数组保存为 NSUser 默认值?我很乐意接受任何建议,即使它们与 NSUser 默认值无关。

标签: arrays swift tuples nsdata


【解决方案1】:

“financialData”的值应该用引号引起来:

NSUserDefaults.standardUserDefaults().setObject("costCategoryArray", forKey: "financialData")
NSUserDefaults.standardUserDefaults().synchronize()

【讨论】:

  • 那我会不会只是盯着字符串“costCategoryData”到 NSUserDefaults 而不是数组 costCategoryData?
【解决方案2】:

您归档到 NSData 并返回的任何内容都需要实现 NSCoding 协议。此外,我发现我的 Swift 类必须扩展 NSObject。下面是一个编码和解码的 Swift 类的简单示例:

class B : NSObject, NSCoding {
    var str : String = "test"

    required init(coder aDecoder: NSCoder) {
        str = aDecoder.decodeObjectForKey("str") as String
    }

    override init() {
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(str, forKey: "str")
    }
}

// create an Object of Class B
var b : B = B()

// Archive it to NSData
var data : NSData = NSKeyedArchiver.archivedDataWithRootObject(b)

// Create a new object of Class B from the data
var b2 : B = NSKeyedUnarchiver.unarchiveObjectWithData(data) as B

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多