mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Implement keypath based dynamic member lookup which augments
functionality of existing @dynamicMemberLookup attribute.
Two new subscript overloads are accepted:
```
subscript(dynamicMember member: KeyPath<T, ...>) -> ...
subscript(dynamicmember member: WritableKeyPath<T, ...>) -> ...
```
Example:
```swift
struct Point {
let x: Int
var y: Int
}
@dynamicMemberLookup struct Lens<T> {
var obj: T
init(_ obj: T) {
self.obj = obj
}
subscript<U>(dynamicMember member: KeyPath<T, U>) -> Lens<U> {
get { return Lens<U>(obj[keyPath: member]) }
}
subscript<U>(dynamicMember member: WritableKeyPath<T, U>) -> Lens<U> {
get { return Lens<U>(obj[keyPath: member]) }
set { obj[keyPath: member] = newValue.obj }
}
}
var lens = Lens(Point(x: 0, y: 0))
_ = lens.x // converted into `lens[dynamicMember: KeyPath<Point, Int>`
_ = lens.y = Lens(10) // converted into `lens[dynamicMember: WritableKeyPath<Point, Int>]`
```
76 KiB
76 KiB