我第一次运行时,我的应用程序崩溃了。这是我的代码:
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!)”]
实际上ExtensionPeriod
是nil
。但是我不明白为什么...... ExtensionPeriod
是nil
,但是根据我写的代码,ExtensionPeriod
将会像“”所以它不是nil
。请帮帮我。
答案 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
也应该可以正常工作。