Swift 元组比较

Swift tuples comparison

有人能告诉我,为什么在类似的情况下 Xcode returns:第一种情况 - 正确,第二种情况 - 错误? 这是一个元组比较。首先它比较整数,但它如何比较字符串?

(5, "life") < (5, "lifiee")// true

(99, "life") < (99, "death")// false

提前感谢您的回答!

在这两种情况下,数值是相等的。
区别在于字符串比较:

  • "life" 是 < "lifiee",因为 "e" 是 < "i"
  • "life" 是 > "death",因为 "l" 是 > "d"

字符串比较逐个字母进行,直到字母不相等或一个字符串结束。例如:

  • "a" < "b",因为 "a" 在字母表中比 "b"
  • "a" < "ab",因为 "a" 比 "ab"
  • "aa" == "aa"

所以对于你的元组:

  • {1, "a"} < {2, "a"} => 1 < 2
  • {1, "a"} < {1, "b"} => 1 == 1 && "a" < "b"

最后,让我们提醒一下,为了比较元组,它们应该有:

  • 相同数量的值。
  • 相同类型。

在此基础上,从左到右依次比较元组,直到发现不匹配。

在第一个例子中:

(5, "life") < (5, "lifiee")

5 和 5 相等,所以我们跳到下两个值进行比较,即 "life" 和 "lifiee";因此:

"life" < "lifiee"

true,也就是说最后的结果是true.

在第二个例子中:

(99, "life") < (99, "death")

99 和 99 相等,所以我们跳到下两个值进行比较,即 "life" 和 "death";因此:

"life" < "death"

false,也就是说最后的结果是false.


要更深入地了解比较是如何进行的,您可以查看 Tuple comparison operators 建议:

@warn_unused_result
public func < <A: Comparable, B: Comparable, C: Comparable>(lhs: (A,B,C), rhs: (A,B,C)) -> Bool {
  if lhs.0 != rhs.0 { return lhs.0 < rhs.0 }
  if lhs.1 != rhs.1 { return lhs.1 < rhs.1 }
  return lhs.2 < rhs.2
}

元组比较比较第一个、第二个等元素,直到找到两个不相等的元素。然后returns这两个元素的比较结果。如果所有元素都相等,则元组相等。

(5, x) < (6, y) returns 无论 x, y 是什么都为真,因为 5 < 6;第一个元素是不同的。

(5, x) < (5, y) returns 与x < y 相同的结果,因为第一个元素相同,所以比较第二个元素。