[swift-evolution] [Idea] Custom default names for arguments of closures

Eugene Gubin hemet.mail at gmail.com
Sun Feb 14 01:30:33 CST 2016

Thanks to all for comments!

> In regular functions parameters names are written near their usage. $0 are
> also all-known. So you don’t need to ‘guess’ parameter name.
> But if we will introduce some closure typealias in one file, and will use
> it in another - then we need somehow to know this parameter name.

I think these argument names become part of API. When one meets some new
API usually some time spent to get familiar with it. Same here.

As an alternative solution, IDE hints can include these parameter names in
> closure autocomplete.

Yes it could. However in this case the feature transforms to autocomplete
hint. If so, I don't see any reason to change anything because it is
possible to write these already.

Actually you suggestion revealed another issue for me. These default names
could shadow names from outer scope. Result could be unexpected.

let one = "outer one"
executeClosure {
        // here one is closure argument not a variable from closure scope
print("one \(one) two \(two)")

However this is a common problem. There was proposal about mandatory self
because of it. I think compiler should warn about name shadowing.

I think you'll be able to accomplish this with SE-0021

I don' think so. That proposal describes a way to unambiguously make
reference to overloaded function using its full name.

2016-02-14 0:16 GMT+03:00 Patrick Gili <gili.patrick.r at gili-labs.com>:

> Hi Eugene,
> I think you'll be able to accomplish this with SE-0021 (
> https://github.com/apple/swift-evolution/blob/master/proposals/0021-generalized-naming.md),
> which has been accepted for Swift 2.2.
> Cheers,
> -Patrick
> On Feb 13, 2016, at 3:38 PM, Eugene Gubin via swift-evolution <
> swift-evolution at swift.org> wrote:
> func executeClosure(closure: Closure) {
> // the caller uses external parameter names, nothing changed here
> closure(first: "first", second: 2)
> }
> executeClosure {
> // the callee uses custom arguments instead of $0, $1
> // also it is possible to override these names here as usual
> print("one \(one) two \(two)")
> }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160214/a116c04f/attachment.html>

More information about the swift-evolution mailing list