gpt4 book ai didi

ios - 有没有办法通过 Swift 中的属性共享 getter 和 setter?

转载 作者:行者123 更新时间:2023-11-28 06:50:33 25 4
gpt4 key购买 nike

我正在构建一个助手来启用对 NSUserDefaults 属性的类型化访问。像这样:

struct UserDefaults {

private static var standardUserDefaults: NSUserDefaults = {
return NSUserDefaults.standardUserDefaults()
}()

private static let propKey = "PROP"
static var prop: Bool {
get {
return standardUserDefaults.boolForKey(propKey)
}
set {
standardUserDefaults.setBool(newValue, forKey: propKey)
standardUserDefaults.synchronize()
}
}

}

这样我就可以有一个很好的语法来读取和写入NSUserDefaults:

UserDefaults.prop // read
UserDefaults.prop = false // write

问题是有很多样板代码,每个附加属性我需要 10 行。

是否有任何方法可以减少每个新属性所需的行数?重用 getter 和 setter?任何类型的运行时生成器?

最佳答案

您可以尝试将实际值包装在一个为您处理所有脏工作的类中:

class WrappedUserDefault<T> {
let key : String
let defaultValue : T

var value : T {
get {
if let value = UserDefaults.standardUserDefaults.objectForKey(key) as? T {
return value
} else {
return defaultValue
}
}
set {
if let value = newValue as? AnyObject {
UserDefaults.standardUserDefaults.setValue(value, forKey: key)
} else {
UserDefaults.standardUserDefaults.removeObjectForKey(key)
}
UserDefaults.standardUserDefaults.synchronize()
}
}

init(key:String, defaultValue:T) {
self.key = key
self.defaultValue = defaultValue
}
}

struct UserDefaults {
static let standardUserDefaults = NSUserDefaults.standardUserDefaults()

static let ready = WrappedUserDefault<Bool>(key:"ready", defaultValue: true)
static let count = WrappedUserDefault<Int>(key: "count", defaultValue: 0)
}

然后再添加一点代码,您将得到:

UserDefaults.count.value++
UserDefaults.ready.value = true
UserDefaults.ready.value

如果 ready.value 的冗长困扰着您,您可以稍微隐藏它,尽管您又回到了拥有大量复制/粘贴代码的状态:

struct UserDefaults {
static let standardUserDefaults = NSUserDefaults.standardUserDefaults()

private static let readyWrapper = WrappedUserDefault<Bool>(key:"ready", defaultValue: true)
static var ready : Bool {
get { return readyWrapper.value }
set { readyWrapper.value = newValue }
}
}

至少在这种情况下,复制/粘贴代码相当简单,因此将来不太可能需要更改。

关于ios - 有没有办法通过 Swift 中的属性共享 getter 和 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35043260/

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