こちらのプロポーザルにより、Swift5.1から @dynamicMemberLookupとKeyPathを組み合わせることで、以前よりも安全にダイナミックなメンバーにアクセスすることができるようになりました。
以下のサンプルでは、Test
という構造体のcolorのcgColorを直接取得したい場合、これまではcomputed propertyを用意する必要があり、それごとにプロパティを用意してあげる必要がありましたが、KeyPathベースのdynamicMemberLookupを使うことにより、 Test
構造体から直接 color
の全てのプロパティにアクセスすることができるようになります。
@dynamicMemberLookup
struct Test {
var color = UIColor.red
subscript<T>(dynamicMember keyPath: KeyPath<UIColor, T>) -> T {
color[keyPath: keyPath]
}
}
// Equivalent
Test().color.cgColor
Test().cgColor
参考
https://developer.apple.com/videos/play/wwdc2019/415/ (20:24付近から)
https://github.com/apple/swift-evolution/blob/master/proposals/0195-dynamic-member-lookup.md
https://github.com/apple/swift-evolution/blob/master/proposals/0252-keypath-dynamic-member-lookup.md