NSKeyedUnarchiver.unarchivedObject 为字典返回 nil

Posted

技术标签:

【中文标题】NSKeyedUnarchiver.unarchivedObject 为字典返回 nil【英文标题】:NSKeyedUnarchiver.unarchivedObject returning nil for dictionary 【发布时间】:2019-03-10 07:55:46 【问题描述】:

我正在尝试将我的代码更新到 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,但在遇到字典 currentUnitPositionColumn 时返回 nil。下面显示的 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
        
    

Dictionary 的某些内容不适用于我的新代码。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

如果您替换,您的代码可以正常工作:

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>

【讨论】:

天啊!您的解决方案有效。非常感谢,我花了几个小时试图让这段代码正常工作。

以上是关于NSKeyedUnarchiver.unarchivedObject 为字典返回 nil的主要内容,如果未能解决你的问题,请参考以下文章