Swift等同于NSUserDefaults上的类别和存储的常量

时间:2015-03-15 22:41:35

标签: swift nsuserdefaults

我习惯于在NSUserDefaults中添加一个类别来帮助管理用户设置,而不会暴露用于存储它们的字符串键。我们的想法是将密钥名称隐藏为NSUserDefaults的内部实现细节,并仅公开setFavoriteColor等方法。

@implementation NSUserDefaults (AppDefaults)

static NSString * const kFavoriteColorKey = @"Favorite Color";

- (NSString *)favoriteColor
{
    return [[NSUserDefaults standardUserDefaults] objectForKey:kFavoriteColorKey];
}

- (void)setFavoriteColor:(NSString *)colorName
{
    [[NSUserDefaults standardUserDefaults] setObject:colorName ForKey:kFavoriteColorKey]
}

用法:

NSLog("Favorite color is %@", [[NSUserDefaults sharedDefaults] favoriteColor]);

这也允许多个不相关的类访问和设置favoriteColor,而不必知道任何键名。我更喜欢这个单个Constants.h文件。

尝试在Swift中使用相同的模式,我立即被无法在扩展中声明新常量所挫败。除非我遗漏了某些内容,否则我无法在扩展程序中存储密钥名称。

任何人都可以建议一种方法可以重现我的Objective-C方法的好处吗?

2 个答案:

答案 0 :(得分:2)

您可以将计算属性与外部Struct一起用于常量。

struct UDKeys {
    static let favoriteColorKey = "favoriteColorKey";

}
extension NSUSerDefaults
{
 var favoriteColor:String
    {
        get
        {
            // return what you need
            return Defaults[UDKeys.favoriteColorKey].string;
        }
        set
        {
            Defaults[UDKeys.favoriteColorKey] = newValue
        }
    }
}

奖励:NSUSerDefauts API并非真正“快速友好”。 在swift中有一个很棒的库来处理NSUserDefauts:https://github.com/radex/SwiftyUserDefaults

答案 1 :(得分:0)

我目前的解决方案是为每个字符串常量使用私有函数:

private func kFavoriteColorKey() -> String {
    return "Favorite Color"
}

public var favoriteColor : String {
    get {
        return objectForKey(kFavoriteColorKey()) as String
    }
    set {
        setObject(favoriteColor, forKey: kFavoriteColorKey())
    }
}

还有什么更好的吗?