[swift-evolution] [Review #2] SE-0161: Smart KeyPaths: Better Key-Value Coding for Swift

Xiaodi Wu xiaodi.wu at gmail.com
Wed Apr 5 22:13:27 CDT 2017


On Wed, Apr 5, 2017 at 9:21 PM, Ricardo Parada via swift-evolution <
swift-evolution at swift.org> wrote:

>
> On Apr 5, 2017, at 9:41 PM, Brent Royal-Gordon via swift-evolution <
> swift-evolution at swift.org> wrote:
>
> It's worth noting that, if you write `\Person.name.valueType`, this syntax
> is ambiguous—it could mean "make a key path for the `valueType` property on
> `name` property of `Person`", or it could mean "make a key path for the
> `name` property of `Person`, then access the key path's `valueType`
> property". We can solve this by always interpreting it as the former and
> requiring parentheses for the latter—that is,
> `(\Person.name).valueType`—but I thought it was worth calling out
> explicitly.
>
>
> Good point.
>
>  I'm thinking about the hypothetical code examples from previous emails:
>
>    let isPuppyQualifier = \Pet.type == .dog && \Pet.age < 12
>    let familyQualifier = (\Family.pets).contains(where: isPuppyQualifier)
>    let familiesWithPuppies = Family.fetch(editingContext, familyQualifier)
>
>
That's an interesting point. While `\` alone seems acceptable, I think it's
unfortunate that we'll have `(\...)` and `\(...)` both in the language.
Can we maybe consider instead:

let firstFriendsNameKeyPath = \Person.friends[0].name\

It is also worth mentioning that, with the sigil, the `keyPath` label may
not be so necessary:

print(luke[\.friends[0].name])
// or, if the suggestion above is accepted
print(luke[\.friends[0].name\])
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170405/520c36bc/attachment.html>


More information about the swift-evolution mailing list