[swift-evolution] Smart KeyPaths

Matt Diephouse matt+swift-evolution at diephouse.com
Sat Mar 18 11:37:10 CDT 2017


> On Mar 17, 2017, at 6:38 PM, Joe Groff via swift-evolution <swift-evolution at swift.org> wrote:
> 
> 
>> On Mar 17, 2017, at 12:34 PM, David Hart via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> 
>> Sent off-list by mistake:
>> 
>> Nice proposal. I have a few comments inline:
>> 
>>> On 17 Mar 2017, at 18:04, Michael LeHew via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>> Use/Mention Distinctions
>>> 
>>> While methods can be referred to without invoking them (let x = foo.bar instead of  let x = foo.bar()), this is not currently possible for properties and subscripts.
>>> 
>>> Making indirect references to a properties' concrete types also lets us expose metadata about the property, and in the future additional behaviors.
>>> 
>> What metadata is attached? How is it accessed? What future features are you thinking about?
> 
> To begin with, you'd have limited ability to stringify a key path. Eventually we'd like to support other reflectiony things, including:
> 
> - Asking for the primary key paths a type supports
> - Asking for a key by name or index
> - Breaking a key path down by components

This might be my new favorite Swift feature. <3 It seems obvious in retrospect, which is surely a sign of its genius.

I would LOVE to be able to get the individual components in a path. Even if it were just the names, that would let me do some things that I’ve been itching to do in Swift. If the types were exposed in a type-erased container, that would be even better.

Something like this would be plenty of information to accomplish my goals:

    class AnyKeyPath {
        …

        struct Key {
            let name: String
            let rootType: Any.Type
            let valueType: Any.Type
        }

        private(set) var keys: [Key]
    }

But even stringifying a key path would probably let me do most of what I wanted. I’d just need to (somewhat awkwardly) split on `.`s and handle subscripts. You mentioned that we’d have “limited” ability to stringify a key path. Can you elaborate on what that means or what the limitations would be?

Matt

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170318/8cab8f01/attachment.html>


More information about the swift-evolution mailing list