【问题标题】:Loading Integer For The First Time Error Using NSUserdefaults Swift使用 NSUserdefaults Swift 首次加载整数时出错
【发布时间】:2015-02-24 17:26:34
【问题描述】:

当我到达带有此代码的页面时:

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()

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

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

【问题讨论】:

    标签: ios xcode swift integer


    【解决方案1】:

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

    这就是为什么你必须写valueForKey("Upgrades")?.integerValue——因为如果返回的值是nil而不是AnyObject,你就不能在上面调用.integerValue。您必须使用 ?. 运算符。将该运算符理解为“如果 this 的结果是 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

    【讨论】:

    • 和以前一样,如果你曾经在 nil 值上使用过!,kaboom。如果没有关键的“钱”,那么你的as? String 将为零,所以money! 会爆炸。请改用我的答案中的一种技术。停止使用! 只是为了让它编译。
    猜你喜欢
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多