"archivedData(withRootObject:)" 在 iOS 12.0 - Swift 5 和 Flutter 中已经被弃用。

5

我有一个项目,其中(iOS 部分)使用的是Swift 4编写。我将其更新到了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

这里有一个名为 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
  }

1个回答

6

在编写Swift代码时,大多数情况下错误信息并不是很有用。第一个错误通常很容易理解,但建议的方法可能会抛出错误。如果你愿意,你可以使用try?来移除throw关键字并忽略这个错误,但更好的做法是捕获并处理这些错误:

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

我已经在主贴中进行了编辑。(添加了computeData部分) - P-J
@P-J,你只需要取消包装生成的BloodData,而不是使用guard返回它,并使用computeData返回你的BloodData以操作它。 - Leo Dabus
你能指导我一下吗?我没有写那个iOS部分,我有点困惑。 - P-J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接