我正在制作一款简单的游戏。如果玩家输了,我希望将他当前的分数与作为NSUserDefault保存为持久存储的最佳分数进行比较。我继续得到“UInt8不能转换为Int8”这是代码
scoreForComparingWithBestScore = UInt8(score)
if ( scoreForComparingWithBestScore > NSUserDefaults.standardUserDefaults().objectForKey("BestScore")){
NSUserDefaults.standardUserDefaults().objectForKey("BestScore") = scoreForComparingWithBestScore
}
即使我打字
scoreForComparingWithBestScore = Int8(score)
错误将被切换。
提前致谢!
答案 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
,而不是过度优化它是Int8
或UInt8
。
答案 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")
}