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