archivedData(withRootObject:)&x27;在iOS 12.0-Swift 5和Flatter中被弃用

archivedData(withRootObject:)&x27;在iOS 12.0-Swift 5和Flatter中被弃用,swift,flutter,Swift,Flutter,我有一个项目是写的(iOS部分)与Swift 4。我将其更新为5,但现在有此警告。我试着按照它的建议修复它,但每次都会出现不同的错误。你能帮我吗 代码 警告 archivedData(withRootObject:)' was deprecated in iOS 12.0: Use +archivedDataWithRootObject:requiringSecureCoding:error: instead 'unarchiveObject(with:)' was deprecated in

我有一个项目是写的(iOS部分)与Swift 4。我将其更新为5,但现在有此警告。我试着按照它的建议修复它,但每次都会出现不同的错误。你能帮我吗

代码

警告

archivedData(withRootObject:)' was deprecated in iOS 12.0: Use +archivedDataWithRootObject:requiringSecureCoding:error: instead
'unarchiveObject(with:)' was deprecated in iOS 12.0: Use +unarchivedObjectOfClass:fromData:error: instead
代码

警告

archivedData(withRootObject:)' was deprecated in iOS 12.0: Use +archivedDataWithRootObject:requiringSecureCoding:error: instead
'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
  }


在大多数情况下,使用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)
}
第二个错误毫无帮助。您可以使用NSKeyedUnachiver的方法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)
}

在大多数情况下,使用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)
}
第二个错误毫无帮助。您可以使用NSKeyedUnachiver的方法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你只需打开生成的血液数据,而不是使用guard返回,然后使用computeData返回你的血液数据,你能指导我吗?我没有写iOS那部分,我有点confused@P-检查我上一次的编辑我在主帖子里做了一次编辑。(添加了computeData部分)@P-J你只需打开生成的血液数据,而不是使用guard返回,然后使用computeData返回你的血液数据,你能指导我吗?我没有写iOS那部分,我有点confused@P-检查我最后的编辑