gpt4 book ai didi

ios - 从 plist 文件保存和加载数字

转载 作者:行者123 更新时间:2023-11-30 11:43:10 25 4
gpt4 key购买 nike

我正在尝试从游戏中的 plist 保存并加载当前关卡。

这就是我的 plist 的样子:

enter image description here

这是我现在加载和保存数据的代码:

class SavedLevel: NSObject, NSCoding {
var level: Double

required init(level:Double = 1) {
self.level = level
}

required init?(coder aDecoder: NSCoder) {
self.level = aDecoder.decodeObject(forKey: "Level") as? Double ?? 0
}

func encode(with aCoder: NSCoder) {
aCoder.encode(level, forKey: "Level")
}
}
class DataModel: NSObject {

var saveLevels = SavedLevel()

func documentsDirectory()->String {
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths.first!
return documentsDirectory
}

func dataFilePath()->String {
return self.documentsDirectory().appendingFormat("/CurrentLevel.plist")
}

override init() {
super.init()
print("document file: \(documentsDirectory())")
print("data file: \(dataFilePath())")
}

func saveData() {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encode(saveLevels, forKey: "CurrentLevel")
archiver.finishEncoding()
data.write(toFile: dataFilePath(), atomically: true)
}

func loadData() {
let path = self.dataFilePath()
let defaultManager = FileManager()
if defaultManager.fileExists(atPath: path) {
let url = URL(fileURLWithPath: path)
let data = try! Data(contentsOf: url)
let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
saveLevels = unarchiver.decodeObject(forKey: "CurrentLevel") as! SavedLevel
unarchiver.finishDecoding()
}
}
}

以下是我如何增加级别计数以及如何尝试保存玩家的当前级别:

var currentLevelNum = 1

if score >= level.targetScore {
gameOverPanel.image = UIImage(named: "LevelComplete")
currentLevelNum = Int(dataModel.saveLevels.level)
if currentLevelNum < NumLevels {
currentLevelNum += 1
dataModel.saveLevels.level = Double(currentLevelNum)
}
dataModel.saveData()
print("Updated level: ",dataModel.saveLevels.level)
showGameOver()
} else if movesLeft == 0 {
gameOverPanel.image = UIImage(named: "GameOver")
dataModel.saveData()
showGameOver()
}

以下是我尝试将数据保存在 AppDelegate 文件中的方法(省略了不必要的代码):

class AppDelegate {

var dataModel = DataModel()

func applicationDidEnterBackground(_ application: UIApplication) {
saveData()
print("Level when app was sent to background: ",dataModel.saveLevels.level)
}

func applicationWillTerminate(_ application: UIApplication) {
saveData()
print("Level when app was terminated: ",dataModel.saveLevels.level)

}

func saveData() {
dataModel.saveData()
}

当关卡完成时,SavedLevel 中的 level 变量会被更新,并增加 1。但是当我将应用程序发送到后台时,会打印 plist 中 Level 的原始值。

示例:

Level at startup:  0.0
Updated level: 1.0
Updated level: 2.0
Level when app was sent to background: 1.0
Updated level: 3.0
Level when app was sent to background: 1.0

与保存关卡有关的某些操作无法正常工作,我不知道问题出在哪里。

感谢任何指导!

最佳答案

使用这个:

var myDict: NSDictionary?
if let path = Bundle.main.path(forResource: "Info", ofType: "plist") {
myDict = NSDictionary(contentsOfFile: path)
let level = myDict?.object(forKey: "level") as! String
print("Your level is: \(level)")
}

关于ios - 从 plist 文件保存和加载数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49121277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com