<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>I don't really get it why the compiler is to complain about the if block not having an else in this case. That seems like a bug that will push us to write unnecessary code. The compiler is not capable of inferring there are more conditions to evaluate in an if statement opposed to a switch statement. Even with the proposed union the compiler cannot infer the need for an else block here because the programmer might not want to do anything else with whatever doesn't match the first condition.</div><div id="AppleMailSignature"><br></div><div id="AppleMailSignature">On the other hand, if you intend to add to this proposal that a switch statement could evaluate the type of the value like the following code, I'd agree with you. I'm just not sure one could do this as of today.</div><div id="AppleMailSignature"><br></div><div id="AppleMailSignature">func input(value: (A | B | C)) {</div><div id="AppleMailSignature">&nbsp; &nbsp;switch value.type {</div><div id="AppleMailSignature">&nbsp; &nbsp; &nbsp; case A:</div><div id="AppleMailSignature">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;...</div><div id="AppleMailSignature">&nbsp; &nbsp; &nbsp; case B:</div><div id="AppleMailSignature">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;...</div><div id="AppleMailSignature">&nbsp; &nbsp; &nbsp; default:</div><div id="AppleMailSignature">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// here the compiler knows I didn't cover all possible types</div><div id="AppleMailSignature">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// adding 'case C' here makes 'default' unnecessary</div><div id="AppleMailSignature">&nbsp; &nbsp;}</div><div id="AppleMailSignature">}</div><div id="AppleMailSignature"><br></div><div id="AppleMailSignature">I would add to this discussion if this would be the best syntax for the proposed type. I'd think about 'union&lt;A, B, C&gt;' as it matched other existing syntax and is a bit more explicit about what's going on the code.</div><div><br>On 16 May 2016, at 7:55 am, Cao Jiannan via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><meta http-equiv="Content-Type" content="text/html charset=gb2312"><div class="">Hi Austin,</div><div class=""><br class=""></div><div class="">let me repeat the example so that clarify my point from this example.</div><div class=""><br class=""></div><div class="">protocol cannot do this:</div><div class=""><br class=""></div><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';"><span class="" style="color: rgb(4, 51, 255);">func</span><span class="">&nbsp;input(value: <font color="#3495af" class="">ProtocolForABC</font></span><span class="">) {</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';">&nbsp; &nbsp; print(value.someCommonProperty)</div><div class=""><span class="" style="color: rgb(0, 143, 0);"><br class=""></span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';"><span class="">&nbsp; &nbsp;&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">if</span><span class="">&nbsp;value&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">is</span><span class="">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">A</span><span class="">&nbsp;{</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; min-height: 13px;"><span class="">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><br class=""></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';"><span class="">&nbsp; &nbsp; }&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">else</span><span class="">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">if</span><span class="">&nbsp;value&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">is</span><span class="">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">B</span><span class="">&nbsp;{</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; min-height: 13px;"><span class="">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><br class=""></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';"><span class="">&nbsp; &nbsp; }&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">else</span><span class="">&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">if</span><span class="">&nbsp;value&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">is</span><span class="">&nbsp;</span><span class="" style="color: rgb(52, 149, 175);">C</span><span class="">&nbsp;{</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; min-height: 13px;"><span class="">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><br class=""></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';"><span class="">&nbsp; &nbsp; }&nbsp;</span><span class="" style="color: rgb(4, 51, 255);">else</span><span class="">&nbsp;{</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code'; color: rgb(0, 143, 0);"><span class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span class="">// There no other cases, but compiler will not trigger a warning.</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';"><span class="">&nbsp; &nbsp; }</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';"><span class="">}</span></div></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';"><span class=""><br class=""></span></div><div class="" style="margin: 0px; line-height: normal;"><span class=""><div style="font-family: Helvetica; font-size: 12px;" class="">The compiler will not know your protocol is only conformed to these three classes.</div><div class="">So the else block will not trigger a warning.</div><div class=""><br class=""></div><div class="">- Jiannan</div><div style="font-family: 'Fira Code'; font-size: 11px;" class=""><br class=""></div></span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'Fira Code';"><br class=""></div><div><blockquote type="cite" class=""><div class="">在 2016年5月16日,18:37,Austin Zheng &lt;<a href="mailto:austinzheng@gmail.com" class="">austinzheng@gmail.com</a>&gt; 写道:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I'm sorry, but I don't understand the point you are trying to make.<div class=""><br class=""></div><div class="">If you pass in a value of type (A | B | C) to a function, what might you want to do with that value?</div><div class=""><br class=""></div><div class="">If you want to do one thing if the value is type A, something else if the value is type B, and something else if the value is type C, then you need to switch or otherwise type check the value at runtime. You can't get around this, no matter whether you use enums, protocols, generics, or union type.</div><div class=""><br class=""></div><div class="">If you want it to do something that A, B, and C all support, use a generic and/or a protocol. In this case limiting the inputs to only those three types is probably a design smell. The whole point of a shared interface is that it only matters that the interface is properly implemented by a type, not what that type is.</div><div class=""><br class=""></div><div class="">If you don't care about doing anything with the value, just make your function generic: func&lt;T&gt;(input: T).</div><div class=""><br class=""></div><div class="">Austin</div><div class=""><br class=""></div></div></div></blockquote></div><br class=""></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></body></html>