It's a little inconsistent, but one could view it as automatic synthesis of ==
for the two different tuple types. Again, illustrating with structs, because it's easier.
extension S {
func ==(lhs: S, rhs: T) { return lhs.x == rhs.x && lhs.y == rhs.y }
}
extension T {
func ==(lhs: T, rhs: S) { return lhs.x == rhs.x && lhs.y == rhs.y }
}
It's inconsistent, in that we don't do it for any types except tuples. (And I am not advocating we start! )