gpt4 book ai didi

caching - Swift getter 代码重复

转载 作者:搜寻专家 更新时间:2023-10-31 22:08:53 24 4
gpt4 key购买 nike

我正在尝试在 swift 中使用变量,这些变量是关键的应用程序范围的用户设置,因此它们必须在每次更改后保存到磁盘。这些变量很少,我对应用程序启动后从磁盘进行的第一次读取感到满意。

我有类似这样的代码:

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,因为我想得到解释如何在这些情况下 DRY getters/setters 而不是接受对特定代码段的批评的答案)

最佳答案

我最近在做类似的事情 - 这可能是你最好的选择。我将它用作嵌套的 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) }
}
}

关于caching - Swift getter 代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26201454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com