<div dir="ltr">That approach seems fine to me; I don&#39;t think it seems like magic.<div><br></div><div>&quot;<font face="monospace, monospace">if x { returnsAnInt() } else { returnsAString() }</font>&quot;  would have type Any, but would only emit a warning if you actually tried to <b>use</b> the value. Much like the current warning, &quot;<i>X inferred to have type Any, which may be unexpected</i>&quot;.</div><div class="gmail_extra"><br clear="all"><div><div><div dir="ltr"><div>Jacob Bandes-Storch<br></div></div></div></div>
<br><div class="gmail_quote">On Sat, Dec 5, 2015 at 7:53 PM, Kevin Ballard 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"><u></u>




<div><span><div>On Sat, Dec 5, 2015, at 04:32 PM, Lukas Stabe via swift-evolution wrote:<br></div>
<blockquote type="cite"><div> </div>
<div><blockquote type="cite"><div>I don&#39;t think you can just get rid of the if statement in favor of an expression. You still want to be able to do this:<br></div>
<div><div dir="ltr"><div> </div>
<div>if (condition) {<br></div>
<div>    funcWithSideEffectsThatReturnsInt()<br></div>
<div>} else {<br></div>
<div>    funcWithSideEffectsThatReturnsString()<br></div>
<div>}<br></div>
<div> </div>
<div>but that&#39;s not a valid expression (what is its type?).<br></div>
</div>
</div>
</blockquote><div> </div>
<div>An if statement with two different types could just have the closes common ancestor or Any as type.<br></div>
</div>
</blockquote><div> </div>
</span><div>That&#39;s a great way to cause confusion.<br></div>
<div> </div>
<div>Rust has this feature (all statements are expressions), and it requires if statements to have an else branch with the same type unless the type is `()`. It&#39;s solution to the issue of the branches returning unwanted values is that Rust uses semicolons, and the semicolon acts sort of like an operator that consumes any value and returns `()`, so if you terminate the last statement of the branch with a semicolon, the whole branch returns `()`, and if you leave it off, the branch returns a value. It&#39;s actually very elegant and straightforward.<br></div>
<div> </div>
<div>That said, proposing that Swift introduce this same rule for semicolons is probably not a good idea. We certainly could declare that an explicit semicolon has this behavior, so you&#39;d see people writing code like<br></div>
<div> </div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">if condition {<br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">    funcWithSideEffectsThatReturnsInt();<br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">}<br></span></div>
<div> </div>
<div>but it would be confusing because semicolons are almost never used in Swift.<br></div>
<div> </div>
<div>An alternative that would work today is just relying on assignment returning Void, so you can write<br></div>
<div> </div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">if condition {<br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">    _ = funcWithSideEffectsThatReturnsInt()<br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">}<br></span></div>
<div> </div>
<div>but that looks kind of weird and would probably also be confusing. Better than the semicolon rule I think, but still not great.<br></div>
<div> </div>
<div>Another option is to check if the return value is actually used anywhere, and if it&#39;s not, then silently coerce it to Void. This way you can write<br></div>
<div> </div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">if condition {<br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">    funcWithSideEffectsThatReturnsInt()<br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">} else {<br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">    funcWithSideEffectsThatReturnsString()<br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">}</span></div>
<div> </div>
<div>and it would be fine but writing<br></div>
<div> </div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">let foo = if condition {</span><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif"><br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">    funcWithSideEffectsThatReturnsInt()</span><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif"><br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">} else {</span><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif"><br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">    funcWithSideEffectsThatReturnsString()</span><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif"><br></span></div>
<div><span style="font-family:menlo,consolas,&quot;courier new&quot;,monospace,sans-serif">}</span><br></div>
<div> </div>
<div>would fail with a type error.<br></div>
<div> </div>
<div>I suspect that this is the right approach, but it does involve a bit of magic.<br></div>
<div> </div>
<div>-Kevin</div>

<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=P-2BsYbBZHRBuLDBJaL4DIKDNfkkjpROowTyRAObV11qwYxTkgxSf6q1m03-2Bfxemp0tcToGEB9v2WUGD19yU-2FFr6p-2FyMpbOYaxUiM-2F-2B-2Benp-2FGCqd3qhS0O-2F6n1PN9hSdqyEke4PicltKRWBiJ4euSoSQ5zBiODF4WjmD3gqKM-2BZAy55irYRzWqZsMq-2BgnsA3ZIf5vCaSqhJ7qjG-2F6wzLxdoaSUr8Q6wyiaTuQiu6aYGzE-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important">
</div>


<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>
<br></blockquote></div><br></div></div>