I agree that it should be completely implicit.
KeyPaths are simply chains of partially-applied properties and subscripts. At the same time, it was noted in the KeyPath proposal that a similar mechanism might be used to model chains of partially-applied functions. I think that having both types be convertible to a closure would be sensible. In fact, you could argue for a general-purpose “Executable” protocol which would allow any conforming object to be implicitly used as a function/closure. Command-style objects such as predictes and transformers would also benefit from such a feature. - Karl > > On Jul 8, 2017 at 11:56 pm, <Benjamin Herzog via swift-evolution > (mailto:swift-evolution@swift.org)> wrote: > > > > Is this operator common in other languages? I would actually expect that the > conversation is not 'almost-implicit' but completely implicit instead. I > think both - a prefix and postfix operator - are not obvious enough what > happens here, especially because this kind of conversion is not happening > in other parts of the language. > All conversions are implicit (from explicit type to protocol, from Swift > stdlib types to Objective-C types, from any type to Any, …) currently. > > > > > ______________________ > > > > Benjamin Herzog > > > > > > > > > On 8. Jul 2017, at 22:10, Hooman Mehr via swift-evolution > > <swift-evolution@swift.org (mailto:swift-evolution@swift.org)> wrote: > > > > > > > > I like this promote operator idea. I have been defining similar operators > > for specific projects almost at random. It makes sense to come up with a > > well-defined behavior and name for such operators, as a common practice as > > you suggest. > > > > > > The problem with the postfix operator is that it does not currently work > > without an extra set of parenthesis: > > > > > > > > > > postfix operator ^ > > > > > > > > postfix func ^<T,U>(lhs: KeyPath<T,U>) -> (T)->U { return { > > $0[keyPath: lhs] } } > > > > > > > > struct Guy { let name: String } > > > > > > > > let guys = [ > > > > Guy(name: "Benjamin"), > > > > Guy(name: "Dave"), > > > > Guy(name: "Brent"), > > > > Guy(name: "Max") > > > > ] > > > > > > > > guys.map(\.name^) // Error: Invalid component of Swift key path > > > > > > > > guys.map((\.name)^) // This works > > > > > > > > > > Is this a bug? > > > > > > > > That is the reason I used a prefix operator (~) in my suggestion in the a > > previous e-mail on this thread. > > > > > > > > > _______________________________________________ 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