2

我想创建一个property wrapperfor 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 CurrentValueSubjecton didSetProjected无论如何都有同样的问题。

我知道我可以读取闭包内的值,但有时我将它与各种函数调用一起使用,最终可能会使用它self.test

4

0 回答 0