<div dir="ltr">The issues raised about local capture by local (inner) functions are valid, likewise the discussion about the @nonescaping annotation are also valid.<div><br></div><div>Rather than expand local function syntax why not deprecate local functions completely and add the @nonescaping annotation to local closures following the argument syntax, e.g. the running example:</div><div><br></div><div>    </div>    class A {<div>        func foo() {</div><div>            let local: @nonescaping () -&gt; void = {<br>                bar() // Capture of self does not need to be explicit in the closure because it is non-escaping.<br>            }</div><div>            local()</div><div>        }</div><div>        func bar() { ... }</div><div>    }</div><div><br></div><div>This is a simpler and more powerful solution (I think others have pretty much suggested the same thing in this forum but have not explicitly said get rid of local functions).</div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">  -- Howard.<br></div></div>
<br><div class="gmail_quote">On 27 October 2017 at 08:16, Mike Kluev 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span class="">On 26 October 2017 at 20:24, David Hart <span dir="ltr">&lt;<a href="mailto:david@hartbit.com" target="_blank">david@hartbit.com</a>&gt;</span> wrote:<br></span><div class="gmail_extra"><div class="gmail_quote"><span class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word">I don’t see how this makes any sense or be possible:<br><div><div><br></div><div>* It doesn’t make sense for me because local is not a member function of A.</div><div>* It would cause ambiguity when trying to call another member function with the same name as the local function.</div></div></div></blockquote><div><br></div></span><div>in the escaping contexts, &quot;self.&quot; is currently required before the instance members (**). </div><div>the idea is to require it before some local functions as well, recursively analysing what these local functions do (at the compile time).</div><div><br></div><div>/* local */ foo() {</div><div>    bar()</div><div>    variable = 1</div><div>}</div><div><br></div><div>...</div><div>self.foo()</div><div><br></div><div>// self is required because the compiler knows what&#39;s inside, and if it were to put the content inline that would be:<br></div><div><br></div><div>// inlining foo pseudo code:</div><div>     self.bar()</div><div>     self.variable = 1</div><div><br></div><div>hence the compiler can figure out that in this case &quot;self&quot; is required before foo()</div><div><br></div><div>on the other hand:</div><div><br></div><div>/* local */ poo() {</div><div>    print(&quot;doesnt not capture anything&quot;)</div><div>}</div><div><br></div><div>here, if compiler were to use poo in the escaping context it would not require &quot;self.&quot; before it.</div><div><br></div><div>this decision (whether to require &quot;self.&quot; on not) can be on the use side.</div><div><br></div><div>(**) FTM, the normal instance methods that do not capture anything may as well not require &quot;self.&quot; before them in escaping contexts:</div><div><br></div><div>/* non local */ baz() {</div><div>    print(&quot;doesn&#39;t capture anything&quot;)</div><div>}</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Mike</div><div><br></div></font></span></div></div></div>
<br>______________________________<wbr>_________________<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/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br></blockquote></div><br></div>