Swift NSUserDefaults第一次没有

时间:2015-07-06 17:46:13

标签: swift nsuserdefaults

我第一次运行时,我的应用程序崩溃了。这是我的代码:

 let State = save.stringForKey("StateSave")
 let City = save.stringForKey("CitySave")
 let Vehicle = save.stringForKey("ModelNumberSave")
 let ExtensionPeriod = save.stringForKey("ExtensionPeriodChoosed")
 let Location = "Location"


 if ExtensionPeriod == nil {
      let name = ""
      var FieldChoosed: Void = save.setObject(name, forKey: "ExtensionPeriodChoosed")
      save.synchronize()

 }

 save.synchronize()
 var DetailNames = ["\(State!)","\(City!)","\(Location)","\(Vehicle!)","\(ExtensionPeriod!)"]

我在这一行得到nil

  

var DetailNames =   [ “(国!)”, “(市!)”, “(位置)”, “(车辆!)”, “(ExtensionPeriod!)”]

实际上ExtensionPeriodnil。但是我不明白为什么...... ExtensionPeriodnil,但是根据我写的代码,ExtensionPeriod将会像“”所以它不是nil。请帮帮我。

3 个答案:

答案 0 :(得分:8)

stringForKey在尚未保存值的情况下返回nil

您需要为您的值提供默认值。最简单的方法是使用??运算符,将nil替换为另一个值:

let State = save.stringForKey("StateSave") ?? "-"

一些一般建议:您需要停止使用!这么多。通常当某些内容返回nil时,这是有充分理由的 - 它可能是nil。当您使用!打开它时,您的程序将崩溃(没有太多有用的信息,为什么)。同样,如果您将值与nil进行比较,通常也是一个不好的迹象。

相反,请查看this list可选处理技术的某些替代方案。

答案 1 :(得分:1)

Airspeed Velocity有一个很好的解决方案,可以通过正确的方式完成你想要做的事情,但他并没有真正解释为什么你所做的不起作用,所以我将解决这个问题的这个方面。

if ExtensionPeriod == nil {
    let name = ""
    var FieldChoosed: Void = save.setObject(name, forKey: "ExtensionPeriodChoosed")
    save.synchronize()
}

该代码块未设置ExtensionPeriod,因此ExtensionPeriod仍为零。它所做的就是将NSUserDefaults中的“ExtensionPeriodChoosed”键的值设置为不再为零。但是,局部变量ExtensionPeriod仍然为零。 ExtensionPeriod不仅神奇地指向存储在NSUserDefaults中的变量,因此当您更新NSUserDefaults时,它会自动更新变量。相反,它会在创建变量时复制变量。

以下是一些示例代码:

    NSUserDefaults.standardUserDefaults().setValue("string", forKey: "s")
    NSUserDefaults.standardUserDefaults().synchronize()
    var s = NSUserDefaults.standardUserDefaults().valueForKey("s")

    NSUserDefaults.standardUserDefaults().setValue("string2", forKey: "s")
    NSUserDefaults.standardUserDefaults().synchronize()
    var y = NSUserDefaults.standardUserDefaults().valueForKey("s")

    println(s)
    println(y)

输出:

  

“string”

     

“字符串2”

为了使你的代码能够工作,如果要保持相同的结构(尽管你真的不应该),你需要将ExtensionPeriod更改为var,然后在if块中,在同步save之后,你必须将ExtensionPeriod重新分配给save.valueForKey(“ExtensionPeriodChoosed”)。

答案 2 :(得分:1)

确保设置应用默认设置的一种方法是使用NSUserDefault的{​​{1}}功能。在Objective-C中,我经常使用registerDefaults(_: [NSObject : AnyObject])类方法,但是覆盖应用程序委托的+ (void)initialize也应该可以正常工作。