[swift-evolution] [Review] SE-0161: Smart KeyPaths: Better Key-Value Coding for Swift
Joe Groff
jgroff at apple.com
Thu Mar 30 19:01:23 CDT 2017
> On Mar 30, 2017, at 1:08 PM, Karl Wagner via swift-evolution <swift-evolution at swift.org> wrote:
>
>> • What is your evaluation of the proposal?
> +1
>
>> • Is the problem being addressed significant enough to warrant a change to Swift?
> Yes
>
>> • Does this proposal fit well with the feel and direction of Swift?
> Yes
>
>> • If you have used other languages or libraries with a similar feature, how do you feel that this proposal compares to those?
> Lots of languages have key-paths, but usually they are strings. This adds some type-safety, so that’s nice.
>
>> • How much effort did you put into your review? A glance, a quick reading, or an in-depth study?
> A quick reading. I also have a couple of questions:
>
> 1) Can we get keypaths from protocol existentials?
>
> protocol MyProto {
> var something: Int { get }
> }
> struct MyThing: MyProto { /* … */ }
>
> let myProtoSomethingKeypath = #keypath(MyProto, .something)
> let value: Int = MyThing()[keypath: myProtoSomethingKeypath] // seems reasonable, right?
Yeah, that would be a natural thing to support.
> 2) What about if it has associated types?
>
> let secondElement = #keypath(Collection, .subscript[1]) // if Collection.Iterator.Element had constraints, could we dig in to the instance?
>
> let _: Int = [1,2,3][keypath: secondElement]
> let _: String = [“a”, “b”, “c”][keypath: secondElement]
>
>
> But I’d still +1 the proposal even if was limited to concrete types.
>
> Also, that brings me to 2 related comments regarding the evolution of the feature:
>
> 1) It would be nice to allow keypaths of constrained protocol existentials
>
> let secondElementFirstCharacter = #keypath(Collection where Iterator.Element == String, .subscript[0].characters.first)
These would rely on supporting generalized existentials in the language at large.
> 2) It would be nice to be able to get keypaths to members which we don’t know exist. Members and protocol conformances may be retroactively added by 3rd-party code.
You could define a library function that applies a key path to a base value, if the base value is castable to the root type of the key path. That might be a useful enough thing to absorb into the standard library at some point, but it doesn't seem to me like it strictly needs to be part of the core proposal.
-Joe
More information about the swift-evolution
mailing list