> Here's a common thing to say:
> 
>    UIView.animate(withDuration:0.4, animations: {
>        self.v.backgroundColor = UIColor.red()
>    })
> 
> That's ugly. I'd rather write:
> 
>    UIView.animate(withDuration:0.4) {
>        self.v.backgroundColor = UIColor.red()
>    }
> 
> What stops me is that `animations:` is not eligible for trailing closure 
> syntax, because it isn't the last parameter — `completion:` is. But 
> `completion:` has a default value, namely `nil` — that's why I'm allowed to 
> omit it. So why can't the compiler work its way backwards through the 
> parameters, and say to itself: "Well, I see a trailing closure, and I don't 
> see any `animations:` label or any `completion:` label, so this trailing 
> closure must be the `animations:` argument and the `completions:` argument 
> must be `nil`."

If we may take leave of practical considerations for a moment, I'd like to note 
that the ideal syntax for a call like this would probably look like:

        UIView.animate(withDuration: 0.4) {
                // animations
        }
        completion { finished in
                // completion
        }

And of course, since `completion` has a default value, this would naturally 
degrade to:

        UIView.animate(withDuration: 0.4) {
                // animations
        }

I'm guessing this isn't possible because the `completion` could instead be a 
call to a separate function with a trailing closure. But is there some way we 
could get something similar? That could significantly improve our handling of 
multi-block APIs and give trailing closures the ability to emulate more kinds 
of syntax.

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to