【问题标题】:archive and unarchive data: SWIFT 4归档和取消归档数据:SWIFT 4
【发布时间】:2019-07-19 16:47:15
【问题描述】:

我有以下代码。它已被弃用,并给了我黄色警告。我希望它消失。有关如何解决此问题的任何想法?

var linearScore = 0
var spreadScore = 0


func saveScores () {
    print("SAVE START")
    let scores : [Int] = [linearScore, spreadScore]
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: scores)
    UserDefaults.standard.set(encodedData, forKey: "scores")
}

func retrieveScores () {
    print("Scores being retrieved")

    //comment out the if/let below to reset goals in dev

    if let data = UserDefaults.standard.data(forKey: "scores"),
        let scoreList = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Int] {

        self.linearScore = scoreList[0]
        self.spreadScore = scoreList[1]

        self.updateTopScores()

    } else {
        print("There is an issue")
        self.saveScores()
    }
}

有错误的弃用代码是以下两行:

让encodedData = NSKeyedArchiver.archivedData(withRootObject: scores)

让 scoreList = NSKeyedUnarchiver.unarchiveObject(with: data) as? [诠释] {

【问题讨论】:

    标签: ios swift core-data deprecated


    【解决方案1】:

    您需要使用新的归档和取消归档方法。首先让你的方法抛出并使用以下方法进行归档:

    class func archivedData(withRootObject object: Any, requiringSecureCoding requiresSecureCoding: Bool) throws -> Data
    

    这用于取消归档:

    class func unarchiveTopLevelObjectWithData(_ data: Data) throws -> Any?
    

    试试这样:

    func saveScores() throws {
        print(#function)
        let scores = [linearScore, spreadScore]
        let encodedData = try NSKeyedArchiver.archivedData(withRootObject: scores, requiringSecureCoding: false)
        UserDefaults.standard.set(encodedData, forKey: "scores")
    }
    
    func retrieveScores() throws {
        print(#function)
        if let data = UserDefaults.standard.data(forKey: "scores"),
            let scoreList = try  NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [Int] {
        } else {
            print("There is an issue")
            self.saveScores()
        }
    }
    

    请注意,自 Swift 4 起,您也可以只使用 Codable 协议对模型数据进行编码/解码

    var linearScore = 2
    var spreadScore = 7
    
    func saveScores() throws  {
        print(#function)
        let scores = [linearScore, spreadScore]
        let encodedData = try JSONEncoder().encode(scores)
        UserDefaults.standard.set(encodedData, forKey: "scores")
        print("scores saved")
    }
    
    func retrieveScored() throws {
        print(#function)
        if let data = UserDefaults.standard.data(forKey: "scores") {
            let scoreList = try JSONDecoder().decode([Int].self, from: data)
            print("scoreList:", scoreList)
        } else {
            print("No data found in user defaults for scores")
        }
    }
    

    如果您不想抛出错误,只需根据需要使用 do try catch:

    func saveScores() {
        print(#function)
        let scores = [linearScore, spreadScore]
        do {
            try UserDefaults.standard.set(JSONEncoder().encode(scores), forKey: "scores")
            print("scores saved")
        } catch {
            print(error)
        }
    }
    
    func retrieveScores() {
        print(#function)
        if let data = UserDefaults.standard.data(forKey: "scores") {
             do {
                let scoreList = try JSONDecoder().decode([Int].self, from: data)
                print("scoreList:", scoreList)
            } catch {
                print(error)
            }
    
        } else {
            print("No data found in user defaults for scores")
        }
    }
    

    【讨论】:

    • 它对我不起作用......也许我没有充实类函数?弃用通常不会让事情变得更容易吗?您的修复似乎增加了很多复杂性。一定有别的办法。
    • 我将发布 Codable 选项
    • 关于复杂性(只是错误处理),您可以简单地忽略使用try?引发的错误
    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多