如何在Swift中使用NSUserDefaults保存颜色?

6

我有一个小问题,关于在NSUserDefaults中保存颜色的主题。在Objective-C中这很容易:

-(NSColor *)colorForKey:(NSString *)key{
NSData  *data;
NSColor *color;
data = [[NSUserDefaults standardUserDefaults] objectForKey:key];
color= [NSUnarchiver unarchiveObjectWithData:data];
if( ! [color isKindOfClass:[NSColor class]] ){
    color = nil;
}
return color;
}

-(void)setColor:(NSColor *)color forKey:(NSString *)key{
    NSData *data = [NSArchiver archivedDataWithRootObject:color];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
}

以上代码在Objective-C中运行良好,但当我尝试在Swift中编写相同的代码时,在从NSUserDefaults读取颜色时出现错误。

 func saveColorForKey (color:NSColor , key:NSString ) {

    var data:NSData = NSData()
    data = NSArchiver.archivedDataWithRootObject(color)
    NSUserDefaults.standardUserDefaults().setObject(data, forKey: key)
}
func colorForKey(key:NSString) -> NSColor{
    var  data: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey(key)
    var color: AnyObject? =  NSUnarchiver.unarchiveObjectWithData(data? as NSData)

    return color as NSColor
}

感谢您,对于我的英语我很抱歉!

请在我的答案正确的情况下打勾,这将有助于其他人在未来。谢谢。 - Danial Hussain
3个回答

16

针对Objective C

像这样的地方。

NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"];

想要恢复如此的状态。

NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];

对于Swift

设置如下

 var userSelectedColor : NSData? = (NSUserDefaults.standardUserDefaults().objectForKey("UserSelectedColor") as? NSData)

if (userSelectedColor != nil) {
    var colorToSetAsDefault : UIColor = UIColor.redColor()
    var data : NSData = NSKeyedArchiver.archivedDataWithRootObject(colorToSetAsDefault)
    NSUserDefaults.standardUserDefaults().setObject(data, forKey: "UserSelectedColor")
    NSUserDefaults.standardUserDefaults().synchronize()
    println("SET DEFAULT USER COLOR TO RED")
}

像这样获得。

if let userSelectedColorData = NSUserDefaults.standardUserDefaults().objectForKey("UserSelectedColor") as? NSData {
    if let userSelectedColor = NSKeyedUnarchiver.unarchiveObjectWithData(userSelectedColorData) as? UIColor {
        println(userSelectedColor)
    }
}

适用于 Swift 4.2

像这样的位置。

let colorToSetAsDefault : UIColor = UIColor.red
let data : Data = NSKeyedArchiver.archivedData(withRootObject: colorToSetAsDefault) as Data
UserDefaults.standard.set(data, forKey: "UserSelectedColor")
UserDefaults.standard.synchronize()
print("SET DEFAULT USER COLOR TO RED")

要像这样回来。

if let userSelectedColorData = UserDefaults.standard.object(forKey: "UserSelectedColor") as? Data {
    if let userSelectedColor = NSKeyedUnarchiver.unarchiveObject(with:userSelectedColorData as Data) as? UIColor {
        print(userSelectedColor)
    }
}

那是Objective-C。问题是如何在Swift中实现它。 - Martin R

0

将NSColor实例存储在用户默认设置中

将aColor的值作为aKey的值存储在用户默认设置中

NSData *theData=[NSArchiver archivedDataWithRootObject:aColor]; [[NSUserDefaults standardUserDefaults] setObject:theData forKey:aKey];


-1

您可以使用属性包装器在UserDefaults中创建自动存储属性。

@propertyWrapper
struct ColorStorage {

    private let key: String

    init(key: String) {
        self.key = key
    }

    var wrappedValue: UIColor {
        get {
            guard let data = UserDefaults.standard.data(forKey: key),
            let components = try? JSONDecoder().decode([CGFloat].self, from: data)
            else { return UIColor.label }
            
            return UIColor(red: components[0], green: components[1], blue: components[2], alpha: components[3])
        }
        set {
            var r, g, b, a: CGFloat
            (r, g, b, a) = (0, 0, 0, 0)
            let data = try? JSONEncoder().encode([r, g, b, a])
            UserDefaults.standard.set(data, forKey: key)
        }
    }
}

使用方法:

struct Settings {
    @ColorStorage(key: "primaryColor")
    static var primaryColor: UIColor
}

Settings.primaryColor = .green
print(Settings.primaryColor)

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