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). Regards, Neil > On Jul 6, 2016, at 10:00 AM, Shane S <electro_alch...@hotmail.com> wrote: > > I’m not convinced that I see this as a bug, maybe more of a feature request? > > The test given seems to be conflating a tuple-type with tuple-pattern… > > Shane > > >> On Jul 5, 2016, at 6:16 PM, Neil Faiman via swift-users >> <swift-users@swift.org> wrote: >> >> SR-1993. >> >>> On Jul 5, 2016, at 4:15 PM, Jordan Rose <jordan_r...@apple.com> wrote: >>> >>> I'd definitely consider that a bug. Can you file it at bugs.swift.org? >>> >>> Jordan >>> >>>> On Jul 4, 2016, at 14:56, Neil Faiman via swift-users >>>> <swift-users@swift.org> wrote: >>>> >>>> (Resending — this didn’t get any responses when I sent it a month ago.) >>>> >>>> Swift 2.2 in Xcode 7.3.1. >>>> >>>> Apparently you cannot use a named tuple constant as an expression pattern >>>> in a case label. >>>> >>>> func test(x: Int, y: Int) -> Int { >>>> let int_1 = 1 >>>> switch x { >>>> case 0: >>>> return 0 >>>> case int_1: >>>> return 1 >>>> default: >>>> break >>>> } >>>> >>>> let int_1_1: (Int, Int) = (1, 1) >>>> switch (x, y) { >>>> case (0, 0): >>>> return 0 >>>> case int_1_1: // <<<< >>>> return 1 >>>> default: >>>> return -1 >>>> } >>>> } >>>> >>>> error: expression pattern of type '(Int, Int)' cannot match values of type >>>> '(Int, Int)' >>>> case int_1_1: >>>> ^~~~~~~ >>>> >>>> The error message is particularly amusing. >>>> >>>> - Neil Faiman >>>> _______________________________________________ >>>> swift-users mailing list >>>> swift-users@swift.org >>>> https://lists.swift.org/mailman/listinfo/swift-users >>> >> >> _______________________________________________ >> swift-users mailing list >> swift-users@swift.org >> https://lists.swift.org/mailman/listinfo/swift-users >
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users