On 06.04.2017 18:10, Ricardo Parada via swift-evolution wrote:
I did not mention single quotes because I was assuming those were reserved
for string literals.

But if they are available for something like this, it would make it obvious
where the key path begins and where it ends.  I went through my
hypothetical code samples, and I don't mind the \ escape character.  For
instance:

   let isPuppyPredicate = \Pet.type == .dog && \Pet.age < 12
   let hasPuppiesPredicate = (\Family.pets).any(isPuppyPredicate)
   let familiesWithPuppies = Family.fetch(editingContext, hasPuppiesPredicate)

I don't mind having to use parenthesis sometimes when invoking a method on
key path for example.

With single quotes it would look like this:

   let isPuppyPredicate = 'Pet.type' == .dog && 'Pet.age' < 12
   let hasPuppiesPredicate = 'Family.pets'.any(isPuppyPredicate)
   let familiesWithPuppies = Family.fetch(editingContext, hasPuppiesPredicate)


FWIW I find this much more clear and visually separated, my mind parses this code much faster then previous code block. Although in this case we have some ambiguity (at first look) if 'Pet.type' is a string or escaped variable, but context will help very much when this feature is used IMO.

In any case, all suggested variants have some kind of ambiguity, so personally I think this is the best suggestion for now. Also, as was said, mentally it is close to keypath/selector string in ObjC.


And creating orderings for example:

   let orderings = [ 'Order.totalAmount'.desc,  'Order.address.zip'.asc ]



On Apr 6, 2017, at 9:55 AM, Ben Rimmington via swift-evolution
<swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:

Re:
<https://github.com/apple/swift-evolution/blob/master/proposals/0161-key-paths.md#referencing-key-paths>

On 6 Apr 2017, at 04:13, Xiaodi Wu wrote:

On Wed, Apr 5, 2017 at 9:21 PM, Ricardo Parada wrote:

On Apr 5, 2017, at 9:41 PM, Brent Royal-Gordon 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\

'Single quotes' (i.e. U+0027 APOSTROPHE) are available AFAIK:

// Create a key path and use it
let firstFriendsNameKeyPath = 'Person.friends[0].name'
luke[keyPath: firstFriendsNameKeyPath] // "Han Solo"

// or equivalently, with type inferred from context
luke[keyPath: '.friends[0].name'] // "Han Solo"

// [SE-0042][SR-3550] Unapplied method references
'String.lowercased()'      // (String) -> String
'String.lowercased(with:)' // (String, Locale?) -> String

Unlike the Lisp-style backtick, an apostrophe would appear on *both* ends
of the key path (or method reference).

-- Ben

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org <mailto:swift-evolution@swift.org>
https://lists.swift.org/mailman/listinfo/swift-evolution



_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to