48 lines
1.5 KiB
Swift
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>
|
|
}
|