Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用默认值保存游戏中的分数_Ios_Swift_Nsuserdefaults - Fatal编程技术网

Ios 使用默认值保存游戏中的分数

Ios 使用默认值保存游戏中的分数,ios,swift,nsuserdefaults,Ios,Swift,Nsuserdefaults,我制作了一个名为“多少个手指”的小应用程序,用户必须猜测电脑背后有多少个手指。现在我希望它能够用NSUserdefaults保存用户分数,但它不起作用。下面是我的代码现在的样子: // // ViewController.swift // How many Fingers? // // Created by Kevin Nguyen on 02.05.15. // Copyright (c) 2015 Kevin Nguyen. All rights reserved. // impo

我制作了一个名为“多少个手指”的小应用程序,用户必须猜测电脑背后有多少个手指。现在我希望它能够用NSUserdefaults保存用户分数,但它不起作用。下面是我的代码现在的样子:

//
//  ViewController.swift
//  How many Fingers?
//
//  Created by Kevin Nguyen on 02.05.15.
//  Copyright (c) 2015 Kevin Nguyen. All rights reserved.
//

import UIKit

class ViewController: UIViewController {


    @IBOutlet var userGuess: UITextField!
    @IBOutlet var userScore: UILabel!
    @IBOutlet var userTotal: UILabel!
    @IBOutlet var result: UILabel!
    var score:Int = 0
    var totalGames:Int = 0

    @IBAction func resetScore(sender: AnyObject) {
        score = 0
        userScore.text = "0"
    }


    @IBAction func start(sender: AnyObject) {
        var userGuessInt = userGuess.text.toInt()
        var fingers = Int(arc4random_uniform(6))
        if userGuessInt <= 5 {
            if userGuessInt == fingers {
                result.text = "Great! You were right!"
                score++
                totalGames++
                userScore.text = "\(score)"
                userTotal.text = "\(totalGames)"
                println("User score is \(score); total games is \(totalGames)")
                NSUserDefaults.standardUserDefaults().setObject(score, forKey: "svScore")
                NSUserDefaults.standardUserDefaults().setObject(totalGames, forKey: "svTotalGames")
            } else {
                result.text = "Try Again!"
                println("User score is \(score); total games is \(totalGames)")
                totalGames++
                userTotal.text = "\(totalGames)"
                NSUserDefaults.standardUserDefaults().setObject(score, forKey: "svScore")
                NSUserDefaults.standardUserDefaults().setObject(totalGames, forKey: "svTotalGames")
            }

        } else{
            result.text = "Enter a number from 0 up to 5!"
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        if score != 0 {
            var score:Int = NSUserDefaults.standardUserDefaults().objectForKey("svScore")! as! Int
            userScore.text = "\(score)"
        }
        if totalGames != 0 {
            var totalGames:Int = NSUserDefaults.standardUserDefaults().objectForKey("svTotalGames")! as! Int
            userTotal.text = "\(totalGames)"
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
//
//ViewController.swift
//有多少个手指?
//
//由Kevin Nguyen于2015年5月2日创作。
//版权所有(c)2015 Kevin Nguyen。版权所有。
//
导入UIKit
类ViewController:UIViewController{
@IBOutlet var userGuess:UITextField!
@IBOutlet var userScore:UILabel!
@IBOutlet var userTotal:UILabel!
@IBVAR结果:UILabel!
变量分数:Int=0
var totalGames:Int=0
@iAction func resetScore(发件人:AnyObject){
分数=0
userScore.text=“0”
}
@iAction func启动(发送方:AnyObject){
var userGuessInt=userGuess.text.toInt()
var fingers=Int(arc4random_统一(6))

如果应用程序启动时用户猜测,则
viewDidLoad
中的
分数始终为
0
。因此,您将永远不会读取保存的数据(因为您的
if
条件)。您还应在尝试使用它之前检查是否存储了数据

这样改变它:

override func viewDidLoad() {
    super.viewDidLoad()

    if (NSUserDefaults.standardUserDefaults().objectForKey("svScore") != nil) {
        score = NSUserDefaults.standardUserDefaults().objectForKey("svScore")! as! Int
    }
    if score != 0 {
        userScore.text = "\(score)"
    }

    if (NSUserDefaults.standardUserDefaults().objectForKey("svTotalGames") != nil) {
         totalGames = NSUserDefaults.standardUserDefaults().objectForKey("svTotalGames")! as! Int
    }
    if totalGames != 0 {
        userTotal.text = "\(totalGames)"
    }
}

您可以创建一个HighscoreSaver util类,如下所示:

class HighscoreSaver {
    private let defaults = NSUserDefaults.standardUserDefaults()
    private let highscoreKey = "highscore-saver-key-item"
    private var highscore:Int = 0

    private func updateHighscore(score:Int){
        highscore += score
        if defaults.integerForKey(highscoreKey) < highscore{
            defaults.setInteger(highscore, forKey: highscoreKey)
        }
    }

    func add(score scoreToAdd:Int){
        updateHighscore(scoreToAdd)
    }

    func reset(){
        defaults.removeObjectForKey(highscoreKey)
    }

    func currentHighscore() -> Int{
        return highscore
    }
}
var high = HighscoreSaver()

//Adds scorevalue to current score
high.add(score: yourScoreToAddToCurrent)

//Resets the score to 0
high.reset()

//Gets current score
high.currentHighscore()

考虑一下你的答案。谢谢你的回答。我尝试了代码,起初我真的认为它是有效的。当我打开应用程序时,例如,我从上次打开应用程序时得到了3分,总游戏量为15,然后如果我再次猜到,它就把总游戏重置为0,得分也得到休息,但不是BeFo。We我猜其中一行是对的。那么在我玩游戏时这两个数字会正常上升。怎么办?@kevini15我在使用局部变量和全局变量时犯了一个小错误。我在回答中删除了代码中的两行。请使用更新后的代码重试。我不建议你使用NSUserDefault。使用model/singelton方法代替NSUserDefault,因为e.安全问题。。
var high = HighscoreSaver()

//Adds scorevalue to current score
high.add(score: yourScoreToAddToCurrent)

//Resets the score to 0
high.reset()

//Gets current score
high.currentHighscore()