微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

archivedData(withRootObject:)' 在 iOS 12.0 中被弃用 - Swift 5 和 Flutter

如何解决archivedData(withRootObject:)' 在 iOS 12.0 中被弃用 - Swift 5 和 Flutter

我有一个使用 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()
    }
  }

警告

archivedData(withRootObject:)' was deprecated in iOS 12.0: Use +archivedDataWithRootObject:requiringSecureCoding:error: instead

代码

 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
  }

警告

'unarchiveObject(with:)' was deprecated in iOS 12.0: Use +unarchivedobjectOfClass:fromData:error: instead

这是一个计算数据函数

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,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
  }

解决方法

在大多数情况下使用 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)
}

第二个错误根本没有帮助。您可以使用 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)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。