NSKeyedUnarchiver.unarchivedObject возвращает ноль для словаря - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь обновить свой код до iOS12.Ниже приведен мой код:

class CurrentGameState: NSObject, NSSecureCoding {

static var supportsSecureCoding: Bool = true
var currentTest1 = Int()
var currentUnitPositionColumn = [String: Int]()
static var currentGameStatus = CurrentGameState(unit: "init", test: 1, column: -1)
var currentTest1 = Int()
var currentUnitPositionColumn = [String: Int]()

init(unit: String, test: Int, column: Int) {

    currentTest1 = test
    currentUnitPositionColumn[unit] = column
}
func encode(with aCoder: NSCoder) {

    aCoder.encode(currentTest1, forKey: test1)
    aCoder.encode(currentUnitPositionColumn, forKey: currentColumn)
}

required init(coder aDecoder: NSCoder) {

    self.currentTest1 = aDecoder.decodeInteger(forKey: test1)
    self.currentUnitPositionColumn = aDecoder.decodeObject(forKey: currentColumn) as! [String : Int]
}

extension PersistData {
func newSaveMatchInfo(saveType: GlobalConstants.saveType) {

    let gameDataFile = "GameData" + String(describing: saveType)
    if let url = getFileURLInAppDocumentDirectory(fileName: gameDataFile) {

        do{

            let archive = try NSKeyedArchiver.archivedData(withRootObject: CurrentGameState.currentGameStatus, requiringSecureCoding: true)
            try archive.write(to: url)

        }catch{
            print("!!!!!Error saving Game data == \(error)")
        }
    }
}

func newLoadMatchInfo(saveType: GlobalConstants.saveType) {

    let gameDataFile = "GameData" + String(describing: saveType)

    guard let gameData = try? Data(contentsOf: getFileURLInAppDocumentDirectory(fileName: gameDataFile)!),
        let gameInfo = try? NSKeyedUnarchiver.unarchivedObject(ofClasses: [CurrentGameState.self], from: gameData as Data ) else {

            print("!!!!!Error gameInfo = try? NSKeyedUnarchiver.unarchivedObject failed ")
            return
    }

    CurrentGameState.currentGameStatus = gameInfo as! 
}
}

Когда я запускаю этот код, NSKeyedUnarchiver работает для Int currentTest1, но возвращает nil при попадании в словарь currentUnitPositionColumn.Старый код, показанный ниже для NSKeyedUnarchiver, работает нормально, но unarchiveObject (withFile: устарел в iOS12.

func loadMatchInfo(saveType: GlobalConstants.saveType) {
    let gameDataFile = "GameData" + String(describing: saveType)
    if let url = getFileURLInAppDocumentDirectory(fileName: gameDataFile) {
        if let gameData = NSKeyedUnarchiver.unarchiveObject(withFile: url.path) as? CurrentGameState {
            CurrentGameState.currentGameStatus = gameData
        }
    }
}

В Словаре есть кое-что, что не будет работать с моим новым кодом. Любая помощь будет очень полезнойоценили.

1 Ответ

0 голосов
/ 05 октября 2018

Ваш код работает нормально, если вы замените:

let gameInfo = try? NSKeyedUnarchiver.unarchivedObject(ofClasses: [CurrentGameState.self], from: gameData as Data ) else {

на:

let gameInfo = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(gameData) else {

Я подозреваю, что не удается использовать unarchivedObject(ofClasses:, потому что вы не можете перечислить Dictionary<String, Int>.

...