代码之家  ›  专栏  ›  技术社区  ›  Ben Packard Ross Knipe

Swift相当于NSUserDefaults上的类别,带有存储的常量

  •  0
  • Ben Packard Ross Knipe  · 技术社区  · 11 年前

    我习惯于将类别添加到 NSUserDefaults 以帮助管理用户设置,而不暴露用于存储它们的字符串键。其想法是将密钥名称隐藏为 NSUser默认值 并且只公开诸如 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 回复  |  直到 11 年前
        1
  •  2
  •   LastMove    11 年前

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

    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

        2
  •  0
  •   Ben Packard Ross Knipe    11 年前

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

    private func kFavoriteColorKey() -> String {
        return "Favorite Color"
    }
    
    public var favoriteColor : String {
        get {
            return objectForKey(kFavoriteColorKey()) as String
        }
        set {
            setObject(favoriteColor, forKey: kFavoriteColorKey())
        }
    }
    

    有更好的吗?