使用NSUserDefaults保存分数:UInt8无法转换为Int8

时间:2014-12-13 15:32:19

标签: swift type-conversion nsuserdefaults

我正在制作一款简单的游戏。如果玩家输了,我希望将他当前的分数与作为NSUserDefault保存为持久存储的最佳分数进行比较。我继续得到“UInt8不能转换为Int8”这是代码

scoreForComparingWithBestScore = UInt8(score)

            if ( scoreForComparingWithBestScore > NSUserDefaults.standardUserDefaults().objectForKey("BestScore")){

                NSUserDefaults.standardUserDefaults().objectForKey("BestScore") =     scoreForComparingWithBestScore

            }

即使我打字

scoreForComparingWithBestScore = Int8(score)

错误将被切换。

提前致谢!

3 个答案:

答案 0 :(得分:1)

NSUserDefaults.standardUserDefaults().objectForKey("BestScore”)会返回AnyObject?。要将其与UInt8(或任何其他Swift数值类型 - 进行比较,您可能需要重新考虑UInt8并使用Int代替,除非有充分的理由坚持使用该类型,您需要打开可选项并将其转换为数字:

if let best = NSUserDefaults.standardUserDefaults().objectForKey("BestScore")?.integerValue {
    // best will be an Int here, you can compare it to scoreForComparingWithBestScore
}
else {
    // either there was no BestScore value, or there was but it wasn't an integer
}

或者,如果不存在(或不是整数),您可以使用??运算符将最佳分数默认为零:

let best = NSUserDefaults
                .standardUserDefaults()
                .objectForKey("BestScore")?
                .integerValue ?? 0

答案 1 :(得分:0)

NSSUserDefaults具有存储不同类型对象的便捷方法。

在您的情况下,您可以直接使用便捷方法,而不是直接存储对象,然后尝试将它们转换为正确的类型:

if let best = NSUserDefaults.standardUserDefaults().integerForKey("BestScore") {
    // best will be an Int here, you can compare it to scoreForComparingWithBestScore
}
else {
    // There was no BestScore value.
}

只要您使用以下值设置值:

NSUserDefaults.setInteger(best, forKey:"BestScore")

然后,由于强类型系统,您将知道您已将整数放入默认值,然后您只需要检查是否为该键设置了值,而不是担心对象是否是正确的类型

这也会推动您的设计,因为您知道该值应该是Int,而不是过度优化它是Int8UInt8

答案 2 :(得分:-1)

我在这里有一些关于如何保存NSUserDefaults以及如何检索它的示例。你在这里看到的是我如何从UITextField中保存文本以及如何保存UISwith。您还将看到我如何从NSUserDefaults中检索此信息。

func saveNSUserDefaults() {
    let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

    defaults.setObject(self.textFieldUrl.text + "/portal/silvertabletmenu.aspx", forKey: "url")

    defaults.setBool(switchToolbar!.on, forKey: "toolbar");
    defaults.synchronize()
}

func loadNSUserDefaults() {
    let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

    if let urlIsNotNil = defaults.objectForKey("url") as? String {
        self.textFieldUrl.text = defaults.objectForKey("url") as String
    }
    if textFieldUrl.text == "" {
        self.textFieldUrl.text = "https://thisisjustanexample.net/"
    }
    switchToolbar!.on = NSUserDefaults.standardUserDefaults().boolForKey("toolbar")
}