我想创建一个property wrapper
for CurrentValueSubject
。我已经这样做了:
@propertyWrapper
public class CurrentValue<Value> {
public var wrappedValue: Value {
get { projectedValue.value }
set { projectedValue.value = newValue }
}
public var projectedValue: CurrentValueSubject<Value, Never>
public init(wrappedValue: Value) {
self.projectedValue = CurrentValueSubject(wrappedValue)
}
}
这行得通,但我想用它来改变一点——使用结构而不是类。为此使用 struct 的问题是有时我会Simultaneous accesses
出错。而且我知道为什么,当sink
我从这个发布者那里尝试从包装值中读取值时,就会发生这种情况。因此,例如使用这样的代码:
@CurrentValue
let test = 1
$test.sink { _ in
print(self.test)
}
而且我或多或少知道为什么 - 因为当projectedValue
执行它的观察时,包装的值仍在设置它的值的过程中。在课堂上这没问题,因为它只会更改值,但是使用 struct 它实际上会修改结构本身,所以我试图同时对其进行写入和读取。
我的问题是 - 是否有一些聪明的方法可以克服这个问题,同时仍然使用结构?我不想dispatch async
。
我也知道它的@Projected
工作原理与此类似propertyWrapper
,但有很大的不同 -Projected
执行 on willSet
,while CurrentValueSubject
on didSet
。Projected
无论如何都有同样的问题。
我知道我可以读取闭包内的值,但有时我将它与各种函数调用一起使用,最终可能会使用它self.test
。