Сохранение цвета при помощи UserDefaults


#1

Всем привет, подскажите как сделать правильное сохранение цвета и его отображение? Нужно при нажатии на определенный цвет, сохранять его и менять, вот как сделал, но выдает ошибку.

func saveColor(customColor: UIColor) {
    UserDefaults.standard.set(customColor, forKey: "customColor")
    UserDefaults.standard.synchronize()
}

func getColor() -> (UIColor) {
    return UserDefaults.standard.object(forKey: "customColor") as! (UIColor)
}

И вот установка:

@IBAction func button(_ sender: UIButton) {
    if sender.restorationIdentifier == "black" {
        saveColor(customColor: UIColor.black)
        customText.textColor = getColor()
    } else if sender.restorationIdentifier == "blue" {
        saveColor(customColor: UIColor.blue)
        customText.textColor = getColor()
    } else if sender.restorationIdentifier == "yellow" {
        saveColor(customColor: UIColor.yellow)
        customText.textColor = getColor()
    } else if sender.restorationIdentifier == "green" {
        saveColor(customColor: UIColor.green)
        customText.textColor = getColor()
    }
}

#2

Сохраняйте название цвета, например так:

enum Color: String {
    case black, blue, yellow, green
}

func save(color: Color) {
    UserDefaults.standard.set(color.rawValue, forKey: "customColor")
    UserDefaults.standard.synchronize()
}

var color: UIColor? {
    guard let name = UserDefaults.standard.object(forKey: "customColor") as? String,
        let color = Color(rawValue: name) else { return nil }
    switch color {
    case .black: return .black
    case .blue: return .blue
    case .yellow: return .yellow
    case .green: return .green
    }
}

save(color: .blue)
customText.textColor = color


#3

Только вчера решал эту задачу. Вот мой вариант:

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

Таким образом можно хранить словари, массивы и так далее…


#4

Спасибо, все получилось)


#5

Тоже не плохой вариант, есть идеи куда приткнуть)
Спасибо)