> 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

Reply via email to