vds_ios/VDS/Classes/ProxPropertyWrapper.swift
Matt Bruce 13b5ea2a55 forwarding proxy propertywrapper
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
2022-07-29 16:06:32 -05:00

48 lines
1.5 KiB
Swift

//
// ProxPropertyWrapper.swift
// VDS
//
// Created by Matt Bruce on 7/29/22.
//
import Foundation
//https://gist.github.com/jegnux/4a9871220ef93016d92194ecf7ae8919#file-proxypropertywrapper-swift
@propertyWrapper
public struct AnyProxy<EnclosingSelf, Value> {
private let keyPath: ReferenceWritableKeyPath<EnclosingSelf, Value>
public init(_ keyPath: ReferenceWritableKeyPath<EnclosingSelf, Value>) {
self.keyPath = keyPath
}
@available(*, unavailable, message: "The wrapped value must be accessed from the enclosing instance property.")
public var wrappedValue: Value {
get { fatalError() }
set { fatalError() }
}
public static subscript(
_enclosingInstance observed: EnclosingSelf,
wrapped wrappedKeyPath: ReferenceWritableKeyPath<EnclosingSelf, Value>,
storage storageKeyPath: ReferenceWritableKeyPath<EnclosingSelf, Self>
) -> Value {
get {
let storageValue = observed[keyPath: storageKeyPath]
let value = observed[keyPath: storageValue.keyPath]
return value
}
set {
let storageValue = observed[keyPath: storageKeyPath]
observed[keyPath: storageValue.keyPath] = newValue
}
}
}
// Kudos @johnsundell for this trick
// https://swiftbysundell.com/articles/accessing-a-swift-property-wrappers-enclosing-instance/
extension NSObject: ProxyContainer {}
public protocol ProxyContainer {
typealias Proxy<T> = AnyProxy<Self, T>
}