我习惯于在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方法的好处吗?
答案 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())
}
}
还有什么更好的吗?