<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=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jul 6, 2016, at 8:55, Neil Faiman &lt;<a href="mailto:neil.swift@faiman.org" class="">neil.swift@faiman.org</a>&gt; wrote:</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="">It’s actually more complicated than that.<div class=""><br class=""></div><div class=""><b class="">case (0, 0):</b>&nbsp;is a <i class="">tuple-pattern</i>, so its interpretation is well defined. <b class="">case int_1_1:</b>&nbsp;must be an <i class="">expression-pattern</i>, since it does’t match any of the other pattern kinds. So it should compare the value of the pattern expression <b class="">case_1_1</b>&nbsp;against the value of the switch expression <b class="">(x, y)</b>.</div><div class=""><br class=""></div><div class="">Now, the Swift Reference, in the <i class="">Expression Patterns</i>&nbsp;section, says</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class="">The expression represented by the expression pattern is compared with the value of an input expression using the Swift standard library ~= operator. The match succeeds if the ~= operator returns <b class="">true</b>. <i class="">By default, the ~= operator compares two values of the same type using the == operator.</i> …</div><div class=""><br class=""></div></blockquote>If this were true, then my code would compile and work as I expected.<div class=""><br class=""></div><div class="">But in fact, I observe that the expression <b class="">int_1_1 == (x, y)</b>&nbsp;compiles, but the expression <b class="">int_1_1 ~= (x, y)</b>&nbsp;gets the error “Binary operator ‘~=‘ cannot be applied to two ‘(int, int)’ operands.”</div><div class=""><br class=""></div><div class="">This strongly suggests that the emphasized line in the Swift Reference quote does not correctly describe the language behavior — there is a bug either in the documentation (~= was not intended to be defined for tuple types) or in the standard library (~= was intended to be defined for tuple types, but never got implemented).</div></div></div></blockquote><br class=""></div><div>It's somewhere in between the two. More formally, "by default, ~= compares two values of the same type using a conformance to Equatable". Since tuples aren't named types, they don't conform to Equatable, and so we don't use their == operator.</div><div><br class=""></div><div>We could fix this by adding overloads of ~= for tuples, by having the compiler fall back to == in switches, or by eventually allowing tuples to conform to Equatable if their elements do (somehow). Maybe there are other answers I haven't thought of, too.</div><div><br class=""></div><div>Jordan</div><br class=""></body></html>