> On Jul 6, 2016, at 8:55, Neil Faiman <neil.sw...@faiman.org> wrote: > > It’s actually more complicated than that. > > case (0, 0): is a tuple-pattern, so its interpretation is well defined. case > int_1_1: must be an expression-pattern, since it does’t match any of the > other pattern kinds. So it should compare the value of the pattern expression > case_1_1 against the value of the switch expression (x, y). > > Now, the Swift Reference, in the Expression Patterns section, says > > 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 true. By default, the ~= > operator compares two values of the same type using the == operator. … > > If this were true, then my code would compile and work as I expected. > > But in fact, I observe that the expression int_1_1 == (x, y) compiles, but > the expression int_1_1 ~= (x, y) gets the error “Binary operator ‘~=‘ cannot > be applied to two ‘(int, int)’ operands.” > > 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).
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. 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. Jordan
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users