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())
}
}
还有更好的吗?
我习惯于在 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())
}
}
还有更好的吗?