ios - 归档和取消归档数据:SWIFT 4
问题描述
我有以下代码。它已被弃用,并给了我黄色警告。我希望它消失。关于如何解决这个问题的任何想法?
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()
}
}
带有错误的已弃用代码是以下 2 行:
让编码数据 = NSKeyedArchiver.archivedData(withRootObject: 分数)
让 scoreList = NSKeyedUnarchiver.unarchiveObject(with: data) as? [诠释] {
解决方案
您将需要新的归档和取消归档方法。首先让您的方法抛出并使用以下方法进行归档:
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()
}
}
请注意,您也可以使用 Codable 协议从 Swift 4 开始对模型数据进行编码/解码
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")
}
}
推荐阅读
- javascript - 使用 HTML5 输入的离子文件上传
- java - 如何使用 java 8 在函数中构造流
- javascript - 如何修复 FileUpload 上的 InputStream ReadTimeout 错误
- python-3.x - 可以在 Linux 中写入 Python 文件进行部分写入吗?
- c# - 从其他类 C# 访问 Form1 按钮
- php - 为什么当我点击按钮时没有任何反应?
- sql - 从表中的多个列中搜索特定值
- c# - dotnetfiddle.net 在某些情况下会生成换行符 \n 而不是 \r\n
- vb.net - 需要编辑代码以获取两个字符串之间的所有字符串(仅获取第一个)
- karate - 空手道:匹配 xml 中的重复元素