Save/Get 来自 UserDefaults 的 UIColor

Save/Get UIColor from UserDefaults

我需要一些帮助来从 UserDefaults 加载和读取 UIColor。

我找到了一个很好的扩展来做到这一点:

extension UserDefaults {
 func colorForKey(key: String) -> UIColor? {
  var color: UIColor?
  if let colorData = data(forKey: key) {
   color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor
  }
  return color
 }

 func setColor(color: UIColor?, forKey key: String) {
  var colorData: NSData?
   if let color = color {
    colorData = NSKeyedArchiver.archivedData(withRootObject: color) as NSData?
  }
  set(colorData, forKey: key)
 }

}

但是 NSKeyedUnarchiver.unarchiveObject 最近被弃用了,所以我不知道如何从中获取数据。

有什么建议吗? 谢谢!

按照弃用消息告诉您的那样做:

extension UserDefaults {
    func colorForKey(key: String) -> UIColor? {
        if let colorData = data(forKey: key),
            let color = try? NSKeyedUnarchiver.unarchivedObject(ofClass: UIColor.self, from: colorData)
        {
            return color
        } else {
            return nil
        }
    }

    // But why an Option<UIColor> here?
    func setColor(color: UIColor?, forKey key: String) {
        if let color = color,
            let colorData = try? NSKeyedArchiver.archivedData(withRootObject: color, requiringSecureCoding: true)
        {
            set(colorData, forKey: key)
        }
    }
}

在您的代码中,只需替换 2 行,即

替换

color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor

color = try! NSKeyedUnarchiver.unarchivedObject(ofClass: UIColor.self, from: colorData)

//// 在这里你可以使用try?代替try!并将其包装在if-let语句中。您的选择。

替换

colorData = NSKeyedArchiver.archivedData(withRootObject: color) as NSData?

colorData = try? NSKeyedArchiver.archivedData(withRootObject: color, requiringSecureCoding: true)

此外,在 var colorData: NSData? 中使用 Data 而不是 NSData,即

var colorData: Data?