gpt4 book ai didi

ios - 使用 NSUserdefaults Swift 首次加载整数时出错

转载 作者:行者123 更新时间:2023-11-28 07:12:55 26 4
gpt4 key购买 nike

当我到达包含此代码的页面时:

override func viewDidLoad() {
super.viewDidLoad()

//Load Upgrades

let FourthDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
var upgrades = FourthDefaults.valueForKey("Upgrades")?.integerValue
FourthDefaults.synchronize()
Upgrades = upgrades!
}

我收到 EXC_BAD_INSTRUCTIONS 错误:

Upgrades = upgrades!

如果这有帮助,这是我的保存方法。

let FourthDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
FourthDefaults.setObject(Upgrades, forKey: "Upgrades")
FourthDefaults.synchronize()

额外信息:只有当我在保存之前加载此代码时才会发生这种情况。否则它工作正常。

如果您知道如何解决此问题,请回复。谢谢!

最佳答案

valueForKey 返回一个可选的。如果键“upgrades”没有值,则结果将为 nil。在您第一次保存该值之前就是这种情况。

这就是为什么您必须编写 valueForKey("Upgrades")?.integerValue – 因为如果返回的值是 nil 而不是 AnyObject,你不能在上面调用 .integerValue。您必须使用 ?. 运算符。将该运算符解读为“如果此操作的结果为 nil,则停止并返回 nil,否则继续并返回包含下一个方法结果的可选值。”

因此 upgrades 要么是 nil(如果没有这样的键),要么是包含您想要的值的可选值。

如果你使用 ! 强制解包一个可选的,并且它是 nil,你将得到一个运行时断言,就像你得到的那样。因此,您几乎不应该使用 !。您确实需要使用它的次数非常少,您应该仔细考虑是否有其他选择。

在这种情况下,有一个更好的选择——使用 ?? 运算符:

var upgrades = FourthDefaults.valueForKey("Upgrades")?.integerValue ?? 0

(或者在缺少键的情况下您想要的任何默认值,如果不是 0)

?? 读作:如果左边的表达式是nil,则用右边的值代替。否则,使用左侧的展开值。

这样做的好处是您不再需要 !,并且应该消除您的运行时错误。

或者,如果您想在尚未设置值时执行不同的代码,您可以这样写:

if let upgrades = FourthDefaults.valueForKey("Upgrades")?.integerValue {
// use upgrades, which will be unwrapped in this block
}
else {
// handle the value not being set yet
}

关于为什么可选值有用的更多信息,请尝试阅读 this answer .

关于ios - 使用 NSUserdefaults Swift 首次加载整数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27673409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com