功能类似于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类型。