Avatar
KeyPath Member Lookup と Property Wrapper の組み合わせ @propertyWrapper @dynamicMemberLookup struct Ref<Value> { let get: () -> Value let set: (Value) -> Void var wrappedValue: Value { get { get() } nonmutating set { set(newValue) } } subscript<T>(dynamicMember keyPath: WritableKeyPath<Value, T>) -> Ref<T> { Ref<T>( get: { wrappedValue[keyPath: keyPath] }, set: { newValue in wrappedValue[keyPath: keyPath] = newValue } ) } }