用NSUserDefaults保存高分

问题描述:

我试图保存我的比赛的高分。我试图通过NSUserDefaults来做到这一点。这是我使用的代码:用NSUserDefaults保存高分

//To save highest score 
var highestScore:Int = 20 
NSUserDefaults.standardUserDefaults().setObject(highestScore, forKey:"HighestScore") 
NSUserDefaults.standardUserDefaults().synchronize() 

//To get the saved score 
var savedScore: Int = NSUserDefaults.standardUserDefaults().objectForKey("HighestScore") as Int 
println(savedScore) 

但我得到NSUserDefaults一个错误说“预期声明”,我想不出如何正确实现这一点。 或者我应该使用NSArchiver这个吗?如果是这种情况,我怎么能实现这一点?

+0

边注:在plist中NSUserDefaults的存储您的数据,这些数据可以很容易地希望提高自己的得分用户改变。就我个人而言,我已经成功地在几个应用程序中给自己无限的代币。尝试找到更好的方式来存储这些数据。 – erdekhayser 2014-09-23 02:01:24

使用NSCoding。为您的视图控制器创建斯威夫特文件“高分”

import Foundation 

class HighScore: NSObject { 

    var highScore: Int = 0 

    func encodeWithCoder(aCoder: NSCoder!) { 
      aCoder.encodeInteger(highScore, forKey: "highScore") 
    } 

    init(coder aDecoder: NSCoder!) { 
     highScore = aDecoder.decodeIntegerForKey("highScore") 
    } 

    override init() { 
    } 
} 

class SaveHighScore:NSObject { 

    var documentDirectories:NSArray = [] 
    var documentDirectory:String = "" 
    var path:String = "" 

    func ArchiveHighScore(#highScore: HighScore) { 
     documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
     documentDirectory = documentDirectories.objectAtIndex(0) as String 
     path = documentDirectory.stringByAppendingPathComponent("highScore.archive") 

     if NSKeyedArchiver.archiveRootObject(highScore, toFile: path) { 
      println("Success writing to file!") 
     } else { 
      println("Unable to write to file!") 
     } 
    } 

    func RetrieveHighScore() -> NSObject { 
     var dataToRetrieve = HighScore() 
     documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
     documentDirectory = documentDirectories.objectAtIndex(0) as String 
     path = documentDirectory.stringByAppendingPathComponent("highScore.archive") 
     if let dataToRetrieve2 = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? HighScore { 
      dataToRetrieve = dataToRetrieve2 
     } 
     return(dataToRetrieve) 
    } 
} 

然后:

import UIKit 


    class ViewController: UIViewController, UITextFieldDelegate { 
     var Score = HighScore() 

     override func viewDidLoad() { 
      super.viewDidLoad() 

     Score.highScore = 100 
     SaveHighScore().ArchiveHighScore(highScore: Score) 
     var retrievedHighScore = SaveHighScore().RetrieveHighScore() as HighScore 
     println(retrievedHighScore.highScore) 

     } 
    } 
+0

感谢帮助很多 – 2014-09-23 05:38:38

+0

嗨我实现了代码,但我有使用RetrivedHighScore函数的问题。因为返回类型是NSObject,所以我无法与任何int类型变量进行比较。您如何管理数据以便与Ints进行比较。例如,如何知道当前分数是否高于保存的dataToRetrive变量的分数? – 2014-09-23 06:49:19

+0

您必须将您的highScore作为:retrieveHighScore.highScore。我的方式。对RetrieveHighScore函数的调用是一个NSObject,但您可以通过。访问highScore整数。命名。我可以重写代码来存储没有Object调用的整数,但当前更复杂的方式给你一个函数,你可以添加其他的东西。后来对于任何想要存储多于一个变量的项目,除了整数之外的其他类型都可以埋在NSObject中。 – 2014-09-23 11:36:25