如何美化缓存"模式"在斯威夫特?

时间:2015-08-11 07:49:33

标签: swift design-patterns settings nsuserdefaults

我的Swift项目中有一个设置服务,它定义了我的应用程序中可用的所有设置的变量。为了仅在绝对必要时访问NSUserDefaults(为了避免非必要的延迟),我使用缓存变量进行这些设置:

class SettingsService {

    struct UserDefaults {
        static let Setting1 = "Setting1"
    }

    private var setting1Cache : Bool?
    var setting1 : Bool {
        get {
            if let value = setting1Cache {
                return value
            }
            let value = NSUserDefaults.standardUserDefaults().boolForKey(UserDefaults.Setting1)
            setting1Cache = value
            return value
        }
        set {
            setting1Cache = newValue
            NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: UserDefaults.Setting1)
        }
    }
}

尽管代码应该有效,但是当可用设置数量增加时,类很快就会变得非常臃肿。除了为getter的前4行定义一个辅助函数之外,还有什么方法可以使代码更加简洁明了吗?

1 个答案:

答案 0 :(得分:1)

你应该为此使用枚举,唯一的缺点是它只定义了AnyObject。如果可以定义枚举中存储值的自定义getter,则可能是......

enum Userdefaults {
    case Setting1, Setting2

    var key: String {
        switch self {
            case .Setting1: return "setting1key"
            case .Setting2: return "setting2key"
        }

    var value: AnyObject {
        switch self {
            case .Setting1: return NSUserDefaults.standardUserDefaults().boolForKey(key)
            case .Setting2: return NSUserDefaults.standardUserDefaults().stringForKey(key)
        }
    }