Ios 从NSUserDefaults更改为NSCoding
我正在尝试创建我的第一个精灵套件swift游戏,我的游戏数据使用nsuserdefaults。我想让它更安全,所以我正在尝试转换到NSCoding,但我在网上发现的任何东西都没有完全帮助我,只是让我感到困惑(很抱歉,如果答案已经存在,我可能已经看过了,无法理解。) 这是我的游戏状态类:Ios 从NSUserDefaults更改为NSCoding,ios,swift,sprite-kit,nsuserdefaults,nscoding,Ios,Swift,Sprite Kit,Nsuserdefaults,Nscoding,我正在尝试创建我的第一个精灵套件swift游戏,我的游戏数据使用nsuserdefaults。我想让它更安全,所以我正在尝试转换到NSCoding,但我在网上发现的任何东西都没有完全帮助我,只是让我感到困惑(很抱歉,如果答案已经存在,我可能已经看过了,无法理解。) 这是我的游戏状态类: class GameState { var score: Int var highScore: Int var stars: Int var sound: Bool var carType: Int var xS
class GameState {
var score: Int
var highScore: Int
var stars: Int
var sound: Bool
var carType: Int
var xSize: Double
var ySize: Double
var gameOver: Bool
class var sharedInstance: GameState {
struct Singleton {
static let instance = GameState()
}
return Singleton.instance
}
init() {
// Init
score = 0
highScore = 0
stars = 0
carType = 1
sound = true
xSize = 1
ySize = 1
gameOver = false
// Load game state
let defaults = NSUserDefaults.standardUserDefaults()
highScore = defaults.integerForKey("highScore")
stars = defaults.integerForKey("stars")
sound = defaults.boolForKey("sound")
carType = defaults.integerForKey("carType")
xSize = defaults.doubleForKey("xSize")
ySize = defaults.doubleForKey("ySize")
gameOver = defaults.boolForKey("gameOver")
}
func saveState() {
// Update highScore if the current score is greater
highScore = max(score, highScore)
// Store in user defaults
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setInteger(highScore, forKey: "highScore")
defaults.setInteger(stars, forKey: "stars")
defaults.setBool(sound, forKey: "sound")
defaults.setInteger(carType, forKey: "carType")
defaults.setDouble(xSize, forKey: "xSize")
defaults.setDouble(ySize, forKey: "ySize")
defaults.setBool(gameOver, forKey: "gameOver")
NSUserDefaults.standardUserDefaults().synchronize()
} }
我还使用以下方法在其他类中保存和加载数据:
GameState.sharedInstance.*****
我将如何更改它以实现NSCoding,然后从其他类加载和保存数据?谢谢。要保存的类必须符合
NSCoding
协议,并实现必需的init(coder-aDecoder:NSCoder)
和func-encodeWithCoder(aCoder:NSCoder)
下面是一个简化的示例:
class GameState: NSObject, NSCoding {
var score: Int?
var gameOver: Bool?
init(score: Int, gameOver: Bool) {
super.init()
self.score = score
self.gameOver = gameOver
}
required init(coder aDecoder: NSCoder) {
self.score = aDecoder.decodeObjectForKey("score") as? Int
self.gameOver = aDecoder.decodeObjectForKey("gameOver") as? Bool
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.score, forKey: "score")
aCoder.encodeObject(self.gameOver, forKey: "gameOver")
}
}
let myGameState = GameState(score: 42, gameOver: true)
然后,您可以使用NSKeyedArchiver
和NSKeyedUnarchiver
,例如在AppDelegate中,将对象作为数据保存和加载:
func applicationWillTerminate(aNotification: NSNotification) {
NSKeyedArchiver.archiveRootObject(myGameState, toFile: "a/file/path")
}
func applicationDidFinishLaunching(aNotification: NSNotification) {
if let data = NSKeyedUnarchiver.unarchiveObjectWithFile("a/file/path") as? GameState {
myGameState = data
}
}
感谢您的回复,我只想问几个问题:“让myGameState…”您使用什么来代替原始的init()类向每个变量添加值?如何从其他类更新游戏状态?(更新乐谱和音效等)谢谢欢迎。它只是一个init,带有我为示例创建的参数,您不必更改自己的参数。您只需实现“必需”的一个,并确保您要加载的所有属性都在这里声明。哦,好的,我会再试一次,谢谢!对于appdelegate中的toFile,如何将其保存到正在使用的手机?感谢您将其保存在您想要的位置(这与NSUserDefaults在这方面有所不同)。我建议不要在缓存文件夹中(它会定期清理),最好在
NSDocumentDirectory
或任何适合你的应用程序需要的地方进行。好的,如果我们去聊天可以吗,因为这对我来说还是很新的,我需要对我的应用程序提供更具体的帮助,谢谢