Swift 从UserDefault保存/获取UIColor

Swift 从UserDefault保存/获取UIColor,swift,string,uicolor,userdefaults,nskeyedunarchiver,Swift,String,Uicolor,Userdefaults,Nskeyedunarchiver,我需要一些帮助来从UserDefault加载和读取UIColor 我找到了一个很好的扩展: extension UserDefaults { func colorForKey(key: String) -> UIColor? { var color: UIColor? if let colorData = data(forKey: key) { color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UI

我需要一些帮助来从UserDefault加载和读取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)
        }
    }
}
扩展用户默认值{
func colorForKey(键:字符串)->UIColor{
如果让colorData=数据(forKey:key),
让color=try?NSKeyedUnarchiver.unarchivedObject(类:UIColor.self,from:colorData)
{
返回颜色
}否则{
归零
}
}
//但为什么会有这样的选择呢?
func setColor(颜色:UIColor?,分叉键:字符串){
如果让颜色=颜色,
让colorData=try?NSKeyedArchiver.archivedData(withRootObject:color,RequiringSecureCodeding:true)
{
设置(colorData,forKey:key)
}
}
}

在代码中,只需替换两行即可,即

替换

color=NSKeyedUnarchiver.unarchiveObject(带:colorData)作为?UIColor

color=试试看!NSKeyedUnarchiver.unarchivedObject(类:UIColor.self,from:colorData)

////在这里,您可以使用
try?
而不是
try
并将其包装在
if let
语句中。你的选择

替换

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

colorData=try?NSKeyedArchiver.archivedData(带rootobject:color,requireringsecurecoding:true)

此外,在
var colorData:NSData?
中使用
Data
代替
NSData
,即

var colorData: Data?
你的意思是“为什么在这里是可选的?”就像为什么函数
setColor(color:forKey)
color
取一个
Optional
参数一样?