Swift 3.0.1中的元组比较

时间:2017-01-19 13:45:00

标签: swift swift3

根据Apple发布的快速编程语言(Swift 3.0.1) iBook,比较运算符也适用于元组,只要它们不包含布尔值。所以给出以下声明

let t1 = (1, true)
let t2 = (1, true)

以下句子按预期抛出错误

t1 <= t2

然而

y1 == t2

评估为真,这似乎与上述声明相矛盾。 有什么想法吗?

2 个答案:

答案 0 :(得分:8)

Bool 类型符合Equatable,但不符合Comparable

通过实施的Swift Evolution提案

可以比较直到6的元组

  • 等式(==)和不等式(!=),假设所有元组成员类型都符合Equatable
  • 以及小于或等于(<=),小于(<),大于或等于(>=),大于(>) ,假设所有元组成员类型都符合Comparable

现在,IntBool都符合Equatable,而只有Int符合Comparable。因此,比较元组

let t1 = (1, true) // inferred type: (Int, Bool)
let t2 = (1, true)

表示相等/不相等是有效的,因为两个成员都符合Equatable

t1 == t2 // true
t1 != t2 // false

但是,使用Comparable中蓝色打印的运算符无效(因为Bool不存在此类运算符),因为两个tupes的第二个成员的类型都不符合{{1 }}

关于OP的评论:

  

似乎合乎逻辑。但该书列出了比较运算符Comparable==!=>,   等等,然后索赔。官方出版商是苹果公司。

<Equatable==中蓝图的运算符可用于元组比较直到arity 6,因为所有元组成员都具有符合!=的类型。但 意味着他们已自动访问EquatableComparable<=<,{{ 1}}),因为类型可能符合>=但不符合>

然而,Equatable协议继承自Comparable,因此如果元组的成员都符合Comparable(对于元组6的元组),那么所有六个比较运算符({ {1}},EquatableComparable==!=<=)可用于该元组,前两个通过协议继承来自{{ 1}},后四个通过<本身(因为符合后者的类型也必须符合前者,通过协议继承)。

答案 1 :(得分:1)

比较运算符相等运算符不同。您可以通过成员等式检查来检查元组是否相等。

对于某些类型,也存在比较运算符。但是,布尔值不是这种情况。哪个值应该更大,truefalse