$ob
で ObservableObject.Wrapper
が返ってくるところまでは理解されていると思います。これはpropertyWrapperのprojectedValue
の仕組みでObservableObject<T>.Wrapper
が返ってきているためです。 このWrapper
にはさらにKeyPath Dynamic Member Lookupが実装されており、Tに生えてる任意のプロパティを https://developer.apple.com/documentation/swiftui/observedobject/wrapper/subscript(dynamicmember:) を経由して取り出しています。見え方が普通のプロパティアクセスになっているところが特殊です。projectedValue
→ https://github.com/apple/swift-evolution/blob/96a70cd71258d24ad3972c6433a2a45ee255ccf6/proposals/0258-property-wrappers.md#projections KeyPathMemberLookup → https://github.com/apple/swift-evolution/blob/0c2f85b3ae42539a7cd47fca2473a0bf6f345566/proposals/0252-keypath-dynamic-member-lookup.md