我有一个用 Swift 4 编写的项目(iOS 部分)。我将其更新到 5,但现在我收到了此警告。我尝试按照建议修复它,但每次都会遇到不同的错误。你能帮我吗?
代码
func saveData(data: BloodData) {
if let defaults = getUserDefaults() {
BloodData.registerClassName()
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: data)
defaults.set(encodedData, forKey: dataKey)
defaults.synchronize()
}
}
Run Code Online (Sandbox Code Playgroud)
警告
archivedData(withRootObject:)' was deprecated in iOS 12.0: Use +archivedDataWithRootObject:requiringSecureCoding:error: instead
Run Code Online (Sandbox Code Playgroud)
代码
func getData() -> BloodData? {
BloodData.registerClassName()
if let defaults = getUserDefaults(), let data = defaults.data(forKey: dataKey), let decodedData = NSKeyedUnarchiver.unarchiveObject(with: data) as? BloodData {
return computeData(data: decodedData)
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
警告
'unarchiveObject(with:)' was deprecated in iOS 12.0: Use +unarchivedObjectOfClass:fromData:error: instead
Run Code Online (Sandbox Code Playgroud)
这是一个computeData函数:
private func computeData(data: BloodData) -> BloodData? {
let today = Date()
let calendar = Calendar.current
let date1 = calendar.date(bySettingHour: 12, minute: 00, second: 00, of: calendar.startOfDay(for: data.readingDate))!
let date2 = calendar.date(bySettingHour: 12, minute: 00, second: 00, of: calendar.startOfDay(for: today))!
let components = calendar.dateComponents([.day], from: date1, to: date2)
let dayDiff = components.day ?? 0
let newBloodData = BloodData(
whiteCells: data.whiteCells - dayDiff,
fullBlood: data.fullBlood - dayDiff,
platelet: data.platelet - dayDiff,
redCells1: data.redCells1 - dayDiff,
redCells2: data.redCells2 - dayDiff,
bloodPlasma: data.bloodPlasma - dayDiff,
readingDate: date2
)
return newBloodData
}
Run Code Online (Sandbox Code Playgroud)
大多数时候用 Swift 编码时,错误并没有多大帮助。第一个是非常不言自明的,除了建议的方法可能会抛出错误。您可以删除 throw 关键字并使用 try? 忽略错误。如果您愿意,但最好捕获并处理错误:
func save(blood: BloodData, forKey defaultName: String = "BloodDataKey") { // or forKey defaultName: String = dataKey
guard let data = try? NSKeyedArchiver.archivedData(withRootObject: blood, requiringSecureCoding: false) else { return }
UserDefaults.standard.set(data, forKey: defaultName)
}
Run Code Online (Sandbox Code Playgroud)
第二个错误根本没有帮助。您可以使用 NSKeyedUnarchiver 的方法 unarchiveTopLevelObjectWithData ,它也会抛出:
func getBlood(forKey defaultName: String = "BloodDataKey") -> BloodData? { // or forKey defaultName: String = dataKey
guard let data = UserDefaults.standard.data(forKey: defaultName) else { return nil }
guard let bloodData = (try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)) as? BloodData else { return nil }
return computeData(data: bloodData)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4281 次 |
| 最近记录: |