Sorry the title is a mouthful.
Basically this is what I'm trying to do:
@propertyWrapper @dynamicMemberLookup
struct Wrapper<Wrapped> {
var wrappedValue: Wrapped
subscript<Member>(
dynamicMember keyPath: WritableKeyPath<Wrapped, Member>
) -> Wrapper<Member> {
get {
Wrapper(wrappedValue: wrappedValue[keyPath: keyPath])
// error: cannot convert return expression of type 'Wrapper<Wrapped>' to return type 'Wrapper<Member>'
// error: cannot convert value of type 'Member' to expected argument type 'Wrapped'
// fix-it: Insert ' as! Wrapped'
}
set { wrappedValue[keyPath: keyPath] = newValue.wrappedValue }
}
}
I think what I'm trying to do should be possible, because SwiftUI does it. Starting from 38:04 in the talk "Modern Swift API Design" from WWDC 2019, it shows that SwiftUI's Binding
's dynamic member lookup returns a new Binding
:
@propertyWrapper @dynamicMemberLookup
public struct Binding<Value> {
...
public subscript<Property>(
dynamicMember keyPath: WritableKeyPath<Value, Property>
) -> Binding<Property> {
...
}
}
What am I doing wrong?