Swift getter代码重复
问题描述:
我试图让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方法在这些情况下,而不是在一个特定的代码块收到批判)
答
我工作最近类似的事情 - 这可能是你最好的选择。我用它作为嵌套的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) }
}
}
答
如果你在iOS或OS X环境中使用,然后迅速NSUserDefaults的是绝对要做到这一点的正确方法。
http://www.codingexplorer.com/nsuserdefaults-a-swift-introduction/
我承认,我不知道斯威夫特。但是,看起来好像只有'SomeStorageKey'会在你所有的键之间变化。有没有办法重构这个?即你的'get'可以把关键作为参数,你的'set'也可以。 – 2014-10-05 11:38:17