gpt4 book ai didi

swift - 为计算属性添加@Published 行为

转载 作者:行者123 更新时间:2023-12-03 09:28:47 35 4
gpt4 key购买 nike

我正在尝试制作 ObservableObject具有包装 UserDefaults 的属性多变的。

为了符合ObservableObject , 我需要用 @Published 包裹属性.不幸的是,我不能将它应用于计算属性,因为我用于 UserDefaults值。

我怎么能让它工作?我该怎么做才能实现@Published行为?

最佳答案

当 Swift 更新为启用嵌套属性包装器时,这样做的方法可能是创建一个 @UserDefault属性包装器并将其与 @Published 结合使用.

同时,我认为处理这种情况的最佳方法是实现 ObservableObject手动而不是依赖 @Published .像这样的东西:

class ViewModel: ObservableObject {
let objectWillChange = ObservableObjectPublisher()

var name: String {
get {
UserDefaults.standard.string(forKey: "name") ?? ""
}
set {
objectWillChange.send()
UserDefaults.standard.set(newValue, forKey: "name")
}
}
}

属性包装器

正如我在评论中提到的,我认为没有办法将其包装在删除所有样板的属性包装器中,但这是我能想到的最好方法:
@propertyWrapper
struct PublishedUserDefault<T> {
private let key: String
private let defaultValue: T

var objectWillChange: ObservableObjectPublisher?

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 {
objectWillChange?.send()
UserDefaults.standard.set(newValue, forKey: key)
}
}
}

class ViewModel: ObservableObject {
let objectWillChange = ObservableObjectPublisher()

@PublishedUserDefault(key: "name")
var name: String = "John"

init() {
_name.objectWillChange = objectWillChange
}
}

您还需要申报 objectWillChange并以某种方式将其连接到您的属性包装器(我在 init 中这样做),但至少属性定义本身非常简单。

关于swift - 为计算属性添加@Published 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59036863/

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