Сохранить / получить UIColor из UserDefaults - PullRequest
0 голосов
/ 26 октября 2018

Мне нужна помощь для загрузки и чтения UIColor из UserDefaults.

Я нашел хорошее расширение, чтобы сделать это:

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 ]

0 голосов
/ 26 октября 2018

В вашем коде просто замените 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)

Также используйте Data вместо NSData в var colorData: NSData?, то есть

var colorData: Data?
0 голосов
/ 26 октября 2018

Просто сделайте так, как сообщают сообщения об устаревании:

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