从UserDefaults中保存/获取UIColor

3
我需要帮助从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最近已经被弃用,所以我不知道如何从中获取数据。

有什么建议吗? 谢谢!

2个回答

3
在您的代码中,只需替换两行代码,即:
替换 color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColorcolor = 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?

1

只需按照弃用消息所告诉您的方式操作:

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

你的意思是“为什么这里使用Optional<UIColor>?”也就是说,为什么函数setColor(color:forKey)对于Color参数采用了一个Optional类型的参数? - Duncan C

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