> On Jan 4, 2017, at 9:32 PM, Saagar Jha <[email protected]> wrote:
>
>
>
> Saagar Jha
>
>
>
>> On Jan 4, 2017, at 8:35 PM, Douglas Gregor <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>>
>> On Jan 4, 2017, at 7:48 PM, Saagar Jha via swift-evolution
>> <[email protected] <mailto:[email protected]>> wrote:
>>
>>> Check out this thread
>>> <https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160606/020470.html>–it’s
>>> very similar to what you proposed, but it didn’t go anywhere. FWIW +1 to
>>> this as well as the ability to use multiple trailing closures like so:
>>>
>>> animate(identifier: “”, duration: 0, update: {
>>> // update
>>> }, completion: {
>>> // completion
>>> }
>>>
>>> Saagar Jha
>>>
>>>
>>>
>>>> On Jan 4, 2017, at 6:25 PM, Jay Abbott via swift-evolution
>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>
>>>> When you have a function with a closure and then another optional default
>>>> = nil closure at the end, like this:
>>>>
>>>> open static func animate(identifier: String,
>>>> duration: Double,
>>>> update: @escaping AnimationUpdate,
>>>> completion: AnimationCompletion? = nil) {
>>>> You can’t use trailing closure syntax for the update argument when leaving
>>>> the completion argument out/default.
>>>>
>>>> This kind of breaks one of the benefits of default arguments, which is
>>>> that you can add them to existing released functions without breaking the
>>>> calling code. This means you have to add a separate convenience function
>>>> without the extra argument, which is annoying and inelegant.
>>>>
>> Why not simply add the "completion" parameter before the trailing closure?
>> That would still allow existing callers to work, without having to change
>> the language.
>>
>>>> Another annoying thing is that you can easily miss this error if you
>>>> happen to not use trailing closure syntax in your tests or other usage,
>>>> because adding the extra default argument compiles fine for code that uses
>>>> normal syntax.
>>>>
>> The Swift compiler warns when a parameter written as a closure type isn't
>> the last parameter. The warning is actually disabled in the specific case
>> above because you've written it using a typealias... maybe we should warn on
>> such cases (it's worth a bug report). Regardless, in the majority of
>> instances, you'll get a warning, so it won't be silent on disabling trailing
>> closure syntax.
>
> Tried this out in the playground:
>
> func foo(a: () -> (), b: (() -> ())? = nil) {
> a()
> b?()
> }
>
> foo(a: {
> print(“Bar”)
> })
>
> and didn’t receive a warning for it, either.
We don’t warn here because ‘foo’ does have a trailing closure… it’s for the
second parameter. I guess we could still warn about ‘a’ (maybe lump it into the
same bug about the typealias case).
- Doug
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution