[swift-evolution] Better syntax for deferred?
John McCall
rjmccall at apple.com
Mon Jan 4 23:06:31 CST 2016
> On Jan 4, 2016, at 12:41 PM, Howard Lovatt via swift-evolution <swift-evolution at swift.org> wrote:
> I don’t think it is worth changing from defer to the more traditional try finally block, both have pros and cons. Just work with what we have. You can always, as a matter of style, put a single defer block at the end of scope instead of multiple defers throughout the block.
For what it’s worth, the error-handling rationale discusses the trade-offs of the defer syntax. I think we’re very happy with the current syntax.
John.
>
>
>> On 5 Jan 2016, at 1:17 AM, Jeremy Pereira via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>
>>>
>>> On 2 Jan 2016, at 16:49, Maury Markowitz via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>
>>>> On Jan 2, 2016, at 9:38 AM, Nicky Gerritsen <nickygerritsen at me.com <mailto:nickygerritsen at me.com>> wrote:
>>>>
>>>> Defer is used to make code *always* run, even if the function terminates early. Imagine:
>>>
>>> Which is precisely why I called it 'always'. So in your example:
>>>
>>> func doSomethingWith(x: Int) {
>>> print(“1”)
>>> defer { print(“2") }
>>> if x > 3 { defer { print(“yay”); return }
>>> print(“3”)
>>> }
>>>
>>> I would say:
>>>
>>> func doSomethingWith(x: Int) {
>>> print(“1”)
>>> print(“3”)
>>> always {
>>> print(“2")
>>> if x > 3 { print(“yay”) }
>>> }
>>> }
>>>
>>> This is functionally identical, but both the syntax and program flow are greatly improved.
>>
>> No your example is not functionally identical to Nicky’s (notwithstanding the missing closing brace in the original). “defer" defers the closure to the end of the current scope. In this instance , that is the end of the if block. The “yay” must come before the “2” because the if scope exits before the function scope. Also, in the following:
>>
>> func doSomethingWith(x: Int) {
>> print("1")
>> defer { print("2") }
>> if x > 3 { defer { print("yay") } }
>> print("3")
>> }
>>
>> doSomethingWith(4)
>>
>> “yay” comes before “3” for the same reason.
>>
>>
>>>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160104/c5b802ab/attachment.html>
More information about the swift-evolution
mailing list