> On Jan 4, 2017, at 9:44 PM, Saagar Jha <[email protected]> wrote:
>
> 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)
>
If you give “c” a default value (e.g., “= 0”), it will give a warning.
I’m happy for the warning to get more eager, so long as it also gets a Fix-It
at the same time.
- Doug
> Saagar Jha
>
>
>
>> On Jan 4, 2017, at 9:34 PM, Douglas Gregor <[email protected]
>> <mailto:[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