2014-10-05 36 views
3

我试图让swift中的变量成为关键的应用程序范围用户设置,因此每次更改后都必须将其保存到磁盘。有一小部分这些变量,我满足于应用程序启动后第一次从磁盘读取数据。Swift getter代码重复

我有一些代码类似于此:

var _myEnumMember:MyEnum? 
var myEnumMember:MyEnum { 
    get { 
     if let value = _myEnumMember { // in memory 
      return value 
     } 
     var c:Cache = Cache() 
     var storedValue:MyEnum? = c.get("SomeStorageKey"); 
     if let value = storedValue { // exists on disk 
      self.myEnumMember = value // call setter to persist 
      return self.myEnumMember // call getter again with value set 
     } 
     self.myEnumMember = .DefaultValue // assign via setter 
     return self.rankingDuration // call getter after `set` 
    } 
    set (newValue){ 
     self._myEnumMember = newValue // assign to memory 
     var c:Cache = Cache() 
     c.put("SomeStorageKey", data: ser) // store in disk 
    } 

我有大约5-6属性需要做到这一点 - 我不想一遍遍重复自己 - 有什么办法干这个代码,所以我不必在几个地方重复这个逻辑?

(注:定价这里,而不是CR.SE因为我想答案解释怎么干getter/setter方法在这些情况下,而不是在一个特定的代码块收到批判)

+0

我承认,我不知道斯威夫特。但是,看起来好像只有'SomeStorageKey'会在你所有的键之间变化。有没有办法重构这个?即你的'get'可以把关键作为参数,你的'set'也可以。 – 2014-10-05 11:38:17

回答

5

我工作最近类似的事情 - 这可能是你最好的选择。我用它作为嵌套的struct,但它并不严格需要嵌套。

首先,定义一个LocalCache型,将处理您的性能的持久性:

struct LocalCache { 
    // set up keys as constants 
    // these could live in your class instead 
    static let EnumKey  = "EnumKey" 
    static let IntKey  = "IntKey" 
    static let StringKey = "StringKey" 

    // use a single cache variable, hopefully? 
    var cache = Cache() 

    // in-memory values go in a Dictionary 
    var localValues: [String: Any] = [:] 

    // fetch from local storage or from disk 
    // note that the default value also sets the return type 
    mutating func fetch<T>(key: String, defaultValue: T) -> T { 
     if localValues[key] == nil { 
      localValues[key] = cache.get(key) ?? defaultValue 
     } 
     return localValues[key]! as T 
    } 

    // save in both local storage and to disk 
    mutating func store(key: String, _ value: Any) { 
     localValues[key] = value 
     cache.put(key, data: value) 
    } 
} 

然后,LocalCache实例添加到您的类,你可以有很多简单的getter/setter方法。

class Test { 
    // instance of the local cache 
    var localCache = LocalCache() 

    var enumPropery: MyEnum { 
     get { return localCache.fetch(LocalCache.EnumKey, defaultValue: MyEnum.DefaultValue) } 
     set { localCache.store(LocalCache.EnumKey, newValue) } 
    } 

    var intProperty: Int { 
     get { return localCache.fetch(LocalCache.IntKey, defaultValue: 0) } 
     set { localCache.store(LocalCache.IntKey, newValue) } 
    } 

    var stringProperty: String { 
     get { return localCache.fetch(LocalCache.StringKey, defaultValue: "---") } 
     set { localCache.store(LocalCache.StringKey, newValue) } 
    } 
}