<div dir="ltr">+1 from me. I think this complements the options that we already have, [weak self] and [unowned self], but we&#39;re dependent on the result of <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0009-require-self-for-accessing-instance-members.md">SE-0009</a> which affects the viability of this change.<br><div class="gmail_extra"><br><div class="gmail_quote">2015-12-16 1:42 GMT+00:00 Marc Knaup via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">+1 from me. Developers will likely only ever write the rather uncommon <font face="monospace, monospace">[strong self]</font> capture when they know what they are doing.<div>Misuse can happen with any feature, but it is unlikely in this case.</div></div><div><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Dec 16, 2015 at 12:02 AM, Greg Parker via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Swift currently requires that `self` be used explicitly inside closures, to help avoid bugs from unintentional capture. This is annoying when a closure uses `self` a lot. Closures should be allowed to name `[strong self]` in their capture list and thereafter not be required to write `self` everywhere.<br>
<br>
I wrote code this weekend that looked something like this:<br>
<br>
    data = ...<br>
    running = true<br>
    delegate.notifyBegin(data)<br>
<br>
    dispatch_async(queue) {<br>
        self.processData(self.data)<br>
        self.running = false<br>
        self.delegate.notifyEnd(self.data)<br>
    }<br>
<br>
Note the asymmetry: the dispatched code needs to use `self` and the non-dispatched code does not. It is clear that the dispatched closure captures `self`, but it&#39;s annoying that it needed to be mentioned five different times. The noise gets worse with longer closures. The annoyance gets worse when moving code in and out of dispatches or other closures, with lots of editing required each time.<br>
<br>
The proposal would allow the same code to be written like this:<br>
<br>
    data = ...<br>
    running = true<br>
    delegate.notifyBegin(data)<br>
<br>
    dispatch_async(queue) {<br>
        [strong self] in<br>
        processData(data)<br>
        running = false<br>
        delegate.notifyEnd(data)<br>
    }<br>
<br>
Advantages:<br>
* The dispatch&#39;ed code looks like the non-dispatched code.<br>
* The capture of `self` is still obvious.<br>
* The code&#39;s action is clearer without the `self` noise.<br>
<br>
Disadvantages:<br>
* The capture behavior of self&#39;s properties is less obvious. For example, neither closure above captured its own copy of `self.data`, but that behavior is not immediately visible in the second closure.<br>
<br>
<br>
What about [weak self] and [unowned self] ? I do not propose to change the `self` requirement for those closures. In the weak case it is critically important to know where `self` is accessed, because it could potentially become nil between any two accesses. Unowned self might be reasonable to change, but for simplicity I won&#39;t do so here.<br>
<span><font color="#888888"><br>
<br>
--<br>
Greg Parker     <a href="mailto:gparker@apple.com" target="_blank">gparker@apple.com</a>     Runtime Wrangler<br>
<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</font></span></blockquote></div><br></div>
</div></div><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=UZ-2Fw3Bg8EOda-2F-2BSazO07kQ0r5nBosEb9Ga0vHTFIm-2BUUi1GneGzAl-2FCZ-2FsvOgnqj5z-2BsbIu47pObGDaPJqQcPkmQtxM3DOTf9nKrMxSSa7XK4cyk0sWvra-2F2bK99zmPFTAI3q105kYFdupkW2bda6ev0JxUbacCsCbq3kJCOr9OR3TFe3oNu291jGLxkS3-2BhwcM1H37d-2BMkGrfSZY1MvzNO92-2BkdJz-2BQ0TQl0Q6x-2BkE-3D" alt="" width="1" height="1" border="0" style="min-height: 1px !important; width: 1px !important; border-width: 0px !important; margin: 0px !important; padding: 0px !important;">
<br>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br></blockquote></div><br></div></div>