<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Not quite—you can already shadow function names:<div class="">```</div><div class=""><div style="margin: 0px; line-height: normal;" class="">func f() { print("hi") }</div><div style="margin: 0px; line-height: normal;" class="">do {</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; let f = { print("bye") }</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; f()</div><div style="margin: 0px; line-height: normal;" class="">}</div></div><div style="margin: 0px; line-height: normal;" class="">```</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">You can refer to shadowed variables within their initial value—function or not—within a guard let or if let:</div><div style="margin: 0px; line-height: normal;" class="">```</div><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class="">func f() -&gt; (() -&gt; ())? { return { print("hi")} }</div><div style="margin: 0px; line-height: normal;" class="">do {</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; guard let f = f() else { fatalError() }</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; f()</div><div style="margin: 0px; line-height: normal;" class="">}</div><div style="margin: 0px; line-height: normal;" class="">```</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">BUT, you cannot refer to shadowed variables within their initial value otherwise:</div><div style="margin: 0px; line-height: normal;" class="">```</div><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class="">func f() { print("hi") }</div><div style="margin: 0px; line-height: normal;" class="">do {</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; let f = { f(); f() } // ERROR!!!</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; f()</div><div style="margin: 0px; line-height: normal;" class="">}</div></div></div><div style="margin: 0px; line-height: normal;" class="">```</div></div><div class=""><br class=""></div><div class="">This is inconsistent IMO.</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 30, 2017, at 5:17 PM, Derrick Ho &lt;<a href="mailto:wh1pch81n@gmail.com" class="">wh1pch81n@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class="">The answer is simple, it becomes ambiguous about whether it should get the var or the function pointer<br class=""><br class="">Suppose we could do this<br class=""><br class="">let r = 5<br class="">func r() {}<br class=""><br class="">If we call r, should we get 5 or should we get ()-&gt;()<br class=""><br class=""><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Mon, Jan 30, 2017 at 4:21 PM Sean Heber via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I used to believe this was a problem, but once I internalized the idea that this ugliness was a signal to choose better variable and property names, it has ceased to be an issue for me and in fact, IMO, has become an asset of the language.<br class="gmail_msg">
<br class="gmail_msg">
l8r<br class="gmail_msg">
Sean<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
&gt; On Jan 30, 2017, at 3:17 PM, Jaden Geller via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; I personally find it kind of weird that `let x = 0; do { let x = x + 1 }` is disallowed but `let x: Int? = 0; if let x = x { }` is allowed. The former case requires you first rename the variable you plan to shadow, inconveniently:<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; ```<br class="gmail_msg">
&gt; let x = 0<br class="gmail_msg">
&gt; do {<br class="gmail_msg">
&gt;&nbsp; &nbsp;let tempX = x // ew<br class="gmail_msg">
&gt;&nbsp; &nbsp;let x = tempX + 1<br class="gmail_msg">
&gt; }<br class="gmail_msg">
&gt; ```<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;&gt; On Jan 30, 2017, at 11:56 AM, Robert Widmann via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="gmail_msg">
&gt;&gt;<br class="gmail_msg">
&gt;&gt; This seems like it’s running through the same check that disallows defining and calling a closure<br class="gmail_msg">
&gt;&gt;<br class="gmail_msg">
&gt;&gt; let randomFunc : () -&gt; () = randomFunc()<br class="gmail_msg">
&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt; On Jan 30, 2017, at 2:37 PM, Michael Gubik via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt; Example that does not compile:<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let randomArray = randomArray(withCapacity: 4096)<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt; Compiler error: “Variable used within its own initial value”<br class="gmail_msg">
&gt;&gt;&gt; The variable name unfortunately clashes with the function name.<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt; This problem forces the developer to think about an alternative name.<br class="gmail_msg">
&gt;&gt;&gt; IMHO that’s suboptimal since many times the most canonical naming would be one where these two go by the same name.<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt; It’s not a big problem in practice but I wonder if there are plans to change this?<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt; Thanks,<br class="gmail_msg">
&gt;&gt;&gt; Michael Gubik<br class="gmail_msg">
&gt;&gt;&gt;<br class="gmail_msg">
&gt;&gt;&gt; _______________________________________________<br class="gmail_msg">
&gt;&gt;&gt; swift-evolution mailing list<br class="gmail_msg">
&gt;&gt;&gt; <a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
&gt;&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
&gt;&gt;<br class="gmail_msg">
&gt;&gt; _______________________________________________<br class="gmail_msg">
&gt;&gt; swift-evolution mailing list<br class="gmail_msg">
&gt;&gt; <a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; _______________________________________________<br class="gmail_msg">
&gt; swift-evolution mailing list<br class="gmail_msg">
&gt; <a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
swift-evolution mailing list<br class="gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
</blockquote></div>
</div></blockquote></div><br class=""></div></body></html>