【问题标题】:Swift: Create an Array of Double values and save it to NSUserDefaultsSwift:创建一个 Double 值数组并将其保存到 NSUserDefaults
【发布时间】:2014-07-05 09:28:50
【问题描述】:

在我正在开发的应用程序中,我需要创建一个数组来存储变量的值(货币,它是双精度值,当用户输入不同的值时会发生变化)。所以想法是从 NSUSerDefaults 键创建一个数组变量:

var moneyArray:Array = NSUserDefaults.standardUserDefaults().arrayForKey("MoneyArray")

然后我需要附加该值:

 moneyArray.append(money)

现在我要再次保存数组:

NSUserDefaults.standardUserDefaults().setObject(moneyArray,forKey:"MoneyArray")

在中间,我正在打印数组以查看值。但我无法执行此代码。每当我运行应用程序时,都会发生这种情况:

  1. 在控制台上我看到:致命错误:无法打开 Optional.None (lldb)
  2. 在我的代码中突出显示,我看到:线程 1:EXC_BAD_INSTRUCTION...

而且我不知道我做错了什么,也不知道我应该在哪里寻找有关此的更多信息...

【问题讨论】:

  • 你能显示实际崩溃的代码行(打印出数组的值)吗??
  • 崩溃的那一行(突出显示的那一行)是第一行,其中创建了数组

标签: arrays swift nsuserdefaults


【解决方案1】:

我认为类型系统被 arrayForKey 混淆了,因为它实际上仍然返回 AnyObject!

我总是有一个包装器属性:

var myArray : Array<Double>! {
get {
    if let myArray: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("myArray") {
        println("\(myArray)")
        return myArray as Array<Double>!
    }

    return nil
}
set {
    println(myArray)
    NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "myArray")
    NSUserDefaults.standardUserDefaults().synchronize()
}
}

【讨论】:

  • 我不知道您所说的“类型系统变得混乱”是什么意思。 OP 代码中的唯一问题是,如果未设置密钥,array/objectForKey 返回 nil,因此您必须检查这种情况(如您的代码中所示)。 - (在这种特殊情况下,如果键不存在,返回一个空数组也是有意义的。)
  • 好的,那么使用它如何将货币值附加到数组中?因为如果我做 myArray.append 它似乎不起作用('Array'类型的不可变值只有名为'append'的变异成员)
  • @MartinR 不,swift 运行时或编译器经常搞砸——对我来说,我遇到了运行时错误 I386 INVALIDOP 或其他东西——我把它归咎于 swift 是 beta 版。我必须通过将 var 声明为 AnyObject 的解决方法!然后投射它
  • @MartinR 我确实经常得到这个:D
  • 查看是否为零。如果 nil 创建它,如果不是 nil 则创建 mutableCopy
猜你喜欢
  • 2015-06-15
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多