在Swift中测试并加载高分

时间:2015-01-02 19:31:46

标签: ios swift nsuserdefaults

当我试图加载我的高分并看看我刚得到的分数是否更大时,我遇到了一些问题。首先,它似乎是添加了一些先前的分数,使得高分更大。此外,如果我得到的分数是一个大于高分的负数,那么它只会成为新的高分。这是我的高分视图代码:

import UIKit

class HighScore: ViewController {
@IBOutlet weak var HighscoreLabel: UILabel!
@IBOutlet weak var Scorelabel: UILabel!
@IBOutlet weak var NewHighscoreLabel: UILabel!

override func viewDidLoad() {

    let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
    var score = defaults.valueForKey("Score") as? String
    Score = score?.stringByTrimmingCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).toInt() ?? 0
    Scorelabel.text = score

    let SecondDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
    var highscore = SecondDefaults.valueForKey("Highscore") as? String
    Highscore = highscore?.stringByTrimmingCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).toInt() ?? 0
    HighscoreLabel.text = highscore

    if Score < 0 {
        NewHighscoreLabel.text = ""
    }
    else if Score > Highscore {
        Highscore = 0
        Highscore += Score
        var HighscoreString:String = String(format: "Highscore:%i", Highscore)

        let SecondDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
        SecondDefaults.setObject(HighscoreString, forKey: "Highscore")
        SecondDefaults.synchronize()
        HighscoreLabel.text = highscore
        NewHighscoreLabel.text = "New Highscore!"
    }
}

}

以下是我在实际游戏页面上得分的保存代码:

var ScoreString:String = String(format: "Score:%i", Score)
        ScoreLabel.text = (string: ScoreString)
        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject(ScoreString, forKey: "Score")
        defaults.synchronize()

1 个答案:

答案 0 :(得分:0)

首先,您的代码中存在一些问题:无需创建SecondDefaults变量。它总是与默认数据库相同的单例,因此您可以继续使用第一个变量defaults

按照惯例,变量以小写字母开头。使用大写字母ivars非常容易混淆,因为它们看起来像是类名。

逻辑不太清楚,因为您要从viewDidLoad中的用户默认值中检索值,然后比较它们并重新设置一些值。这似乎不符合逻辑。用户默认条目在您阅读时应该按顺序排列 - 您只应在评估分数时调整它们。

还有其他各种不合逻辑的行,例如

highscore = 0
highscore += score

完全等同于

highscore = score

回到你的问题:你不应该把你的高分保存为字符串。毫不奇怪,你遇到各种各样的问题,因为你必须编码和解码这些字符串。相反,将您的分数存储为数字 - 您只需使用它们而无需解析字符串。

您得到的错误可能是因为您在其中一个默认条目中没有值。您应该在应用程序启动时初始化变量,以确保它们在那里。执行此操作的最佳方法是registerDefaults API。

let seedData = ["Score" : 0, "Highscore" : 0]
defaults.registerDefaults(seedData)

只有当这些键不存在时,才会将它们初始化为0。

其余的很容易:

let score = defaults.integerForKey("Score")!
scoreLabel.text = "\(score)"
let highscore = defaults.integerForKey("Highscore")!
highscore.text = "\(highscore)"
newHighscoreLabel.text = ""

请注意,您可以强制打开!,因为您知道变量已初始化。如上所述,从用户默认值中读取分数没有任何意义。您更有可能显示分数屏幕并获得分数值。因此

defaults.setInteger(score, forKey: "Score")
let highscore = defaults.integerForKey("Highscore")!
if score > highscore {
   defaults.setInteger(score, forKey: "Highscore")
   newHighscoreLabel.text = "New Highscore!"
}