So, then this should have a warning? I’m still not getting one.

func foo(a: () -> (), b: (() -> ())? = nil, c: Int) {
        a()
        b?()
}

foo(a: {
        print(“Bar”)
}, c: 0)

Saagar Jha



> On Jan 4, 2017, at 9:34 PM, Douglas Gregor <[email protected]> wrote:
> 
> 
>> On Jan 4, 2017, at 9:32 PM, Saagar Jha <[email protected] 
>> <mailto:[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

Reply via email to