为计算属性添加@Published行为
我试图使它ObservableObject
具有包装UserDefaults
变量的属性。
为了符合要求ObservableObject
,我需要使用来包装属性@Published
。不幸的是,我不能将其应用于计算的属性,因为我使用了这些UserDefaults
值。
我该如何运作?我该怎么做才能达到目的@Published
?
回答:
更新:使用EnclosingSelf下标,可以做到!
奇迹般有效!
import Combineimport Foundation
class LocalSettings: ObservableObject {
static var shared = LocalSettings()
@Setting(key: "TabSelection")
var tabSelection: Int = 0
}
@propertyWrapper
struct Setting<T> {
private let key: String
private let defaultValue: T
init(wrappedValue value: T, key: String) {
self.key = key
self.defaultValue = value
}
var wrappedValue: T {
get {
UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
public static subscript<EnclosingSelf: ObservableObject>(
_enclosingInstance object: EnclosingSelf,
wrapped wrappedKeyPath: ReferenceWritableKeyPath<EnclosingSelf, T>,
storage storageKeyPath: ReferenceWritableKeyPath<EnclosingSelf, Setting<T>>
) -> T {
get {
return object[keyPath: storageKeyPath].wrappedValue
}
set {
(object.objectWillChange as? ObservableObjectPublisher)?.send()
UserDefaults.standard.set(newValue, forKey: object[keyPath: storageKeyPath].key)
}
}
}
以上是 为计算属性添加@Published行为 的全部内容, 来源链接: utcz.com/qa/409060.html