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

Swift equivalent to category on NSUserDefaults with stored constants

我习惯于在 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 方法的好处的方法吗?

您可以将计算属性与常量的外部结构一起使用。

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-friendly"。 swift 中有一个很棒的库可以处理 NSUserDefauts:https://github.com/radex/SwiftyUserDefaults

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

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

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

还有更好的吗?