[swift-evolution] Proposal: Allow `[strong self]` capture in closures and remove the `self` requirement therein

Marc Knaup marc at knaup.koeln
Tue Dec 15 19:42:19 CST 2015


+1 from me. Developers will likely only ever write the rather uncommon [strong
self] capture when they know what they are doing.
Misuse can happen with any feature, but it is unlikely in this case.

On Wed, Dec 16, 2015 at 12:02 AM, Greg Parker via swift-evolution <
swift-evolution at swift.org> wrote:

> 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.
>
> I wrote code this weekend that looked something like this:
>
>     data = ...
>     running = true
>     delegate.notifyBegin(data)
>
>     dispatch_async(queue) {
>         self.processData(self.data)
>         self.running = false
>         self.delegate.notifyEnd(self.data)
>     }
>
> 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'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.
>
> The proposal would allow the same code to be written like this:
>
>     data = ...
>     running = true
>     delegate.notifyBegin(data)
>
>     dispatch_async(queue) {
>         [strong self] in
>         processData(data)
>         running = false
>         delegate.notifyEnd(data)
>     }
>
> Advantages:
> * The dispatch'ed code looks like the non-dispatched code.
> * The capture of `self` is still obvious.
> * The code's action is clearer without the `self` noise.
>
> Disadvantages:
> * The capture behavior of self'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.
>
>
> 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't do so here.
>
>
> --
> Greg Parker     gparker at apple.com     Runtime Wrangler
>
>
> _______________________________________________
> 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/20151216/d7e94f5b/attachment.html>


More information about the swift-evolution mailing list