<div dir="ltr">I did read it, but I think I skimmed it a bit too fast. You&#39;re correct in that it essentially solves the same problem using a different syntax (more compact at that). I think when I initially read it, I parsed it as the method would return at any point if the objects were freed (mid-execution of the closure). Re-reading it, I see that the proposal is in fact identical in functionality to mine, just with a different syntax. <div><br></div><div>Given that your proposal still allows for overriding the behavior on an individual basis, the same thing can be accomplished. I&#39;ll put my support behind your draft, rather than expending more time with mine. :)</div><div><br></div><div>Cheers, </div><div><br></div><div>David</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 22, 2017 at 12:57 PM, Matthew Johnson <span dir="ltr">&lt;<a href="mailto:matthew@anandabits.com" target="_blank">matthew@anandabits.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">Hi David,<div><br></div><div>I just shared a draft proposal to introduce guarded closures last week: <a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20170213/032478.html" target="_blank">https://lists.swift.org/<wbr>pipermail/swift-evolution/<wbr>Week-of-Mon-20170213/032478.<wbr>html</a>.  I think you would find it very interesting.</div><div><br></div><div>I considered including a new capture list specifier `guard` in this proposal but decided against it.  Guarded behavior requires prefixing the contents of the closure with a guard clause that returns immediately if the guard is tripped.  This is a property of the closure as a whole, not of an individual capture.  For that reason, I decided that allowing a `guard` specifier for an individual capture would be inappropriate.  </div><div><br></div><div>Instead, a guarded closure has a guarded by default capture behavior which can be overridden with `weak`, `unowned` or `strong` in the capture list.  The thread on this proposal was relatively brief.  I plan to open a PR soon after making a few minor modifications.</div><div><br></div><div>Matthew</div><div><br><div><blockquote type="cite"><div><div class="h5"><div>On Feb 22, 2017, at 2:48 PM, David Hedbor via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br class="m_6478817709710489288Apple-interchange-newline"></div></div><div><div><div class="h5"><div dir="ltr"><span style="font-size:12.8px">Hello,</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">(apologies if this got sent twice - gmail and Apple mail seems to confused as to what account the first mail was sent from)</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">I’m new to this mailing list, but have read some archived messages, and felt that this would be a reasonable subject to discuss. It’s somewhat related to the recent posts about @selfsafae/@guarded but distinctly different regardless.</span><br style="font-size:12.8px"><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">Problem:</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">It’s often desirable not to capture self in closures, but the syntax for doing so adds significant boilerplate code for [weak self] or us unsafe when used with [unowned self]. Typically you’d do something like this:</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">  { [weak self] in    self?.execute() }</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">This is simple enough but often doesn’t work:</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">{ [weak self] in self?.boolean = self?.calculateBoolean() ]</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">This fails because boolean is not an optional. This in turn leads to code like this:</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">{ [weak self] in</span><br style="font-size:12.8px"><span style="font-size:12.8px">   guard let strongSelf = self else { return }</span><br style="font-size:12.8px"><span style="font-size:12.8px">   strongSelf.boolean = self.calculateBoolean()  }</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">And this is the boilerplate code. My suggestion is to add a syntax that works the same as the third syntax, yet doesn’t require the boilerplate code.</span><br style="font-size:12.8px"><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">Solution:</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">Instead of using unowned or weak, let’s use guard/guarded syntax:</span><br style="font-size:12.8px"><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">{ [guard self] in</span><br style="font-size:12.8px"><span style="font-size:12.8px">   self.isExecuted = self.</span><span style="font-size:12.8px">onlyIfWeakSelfWasCaptured<wbr>()</span><br style="font-size:12.8px"><span style="font-size:12.8px">}</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">In essence, guarded self is equivalent to a weak self, that’s captured when the closure is executed. If it was already released at that point, the closure is simply not executed. It’s equivalent to:</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">{ [weak self] in</span><br style="font-size:12.8px"><span style="font-size:12.8px">   guard let strongSelf = self else { return }</span><br style="font-size:12.8px"><span style="font-size:12.8px">   strongSelf.isExecuted = strongSelf.</span><span style="font-size:12.8px">onlyIfWeakSelfWasCa<wbr>ptured()</span><br style="font-size:12.8px"><span style="font-size:12.8px">}</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">Except with a lot less boilerplate code, while not losing any clarify in what it does.</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">Impact / compatibility:</span><br style="font-size:12.8px"><br style="font-size:12.8px"><span style="font-size:12.8px">This is simply additive syntax, and wouldn’t affect any existing code.</span><br></div></div></div>
______________________________<wbr>_________________<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" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br></div></blockquote></div><br></div></div></blockquote></div><br></div>