@propertyWrapper
final class Wrapper<T> {
final class InnerWrapper {
let val: T
init(val: T) {self.val = val}
}
var storedValue: InnerWrapper
var projectedValue: InnerWrapper {
storedValue
}
var wrappedValue: T {
self.storedValue.val
}
init(wrappedValue: T) {
self.storedValue = InnerWrapper(val: wrappedValue)
}
init(projectedValue: Wrapper) {
self.storedValue = projectedValue.storedValue
}
}
in a type's body, it works fine:
class Base {
@Wrapper // It works fine.
var x = 0
func run() {
let y = x
// foo(val: $x)
}
}
when using it on a function, I got an error: cannot convert value of type 'Wrapper<T>.InnerWrapper' to expected argument type 'Wrapper<T>'
The error message is not helpful, but the error is because your init(projectedValue) accepts the wrapper type instead of the projected value type. This fixes the problem:
@propertyWrapper
final class Wrapper<T> {
final class InnerWrapper {
let val: T
init(val: T) {self.val = val}
}
var storedValue: InnerWrapper
var projectedValue: InnerWrapper {
storedValue
}
var wrappedValue: T {
self.storedValue.val
}
init(wrappedValue: T) {
self.storedValue = InnerWrapper(val: wrappedValue)
}
init(projectedValue: InnerWrapper) {
self.storedValue = projectedValue
}
}
func foo<T>(@Wrapper val: T) {}