功能类似于React的useRef,避免引起视图更新

final class Box<V> {
    var value: V
    init(_ value: V) {
        self.value = value
    }
}

@propertyWrapper struct Ref<V> {
    private var box: Box<V>
    var wrappedValue: V {
        get { box.value }
        nonmutating set {
            box.value = newValue
        }
    }
    init(wrappedValue value: V) {
        self.box = Box(value)
    }
}

extension Ref where V: ExpressibleByNilLiteral {
    init() {
        self.init(wrappedValue: nil)
    }
}

nonmutating是用来标记set方法不会更新变量值,这里我们需要将存储的值设置为引用类型,不然无法满足nonmutating要求。ExpressibleByNilLiteral就是optional类型。

SwiftUI:@State原理解析