Swift学习:基本运算符(Basic Operators) (2)

  当元组中的值可以比较时,你也可以使用这些运算符来比较它们的大小。例如,因为 Int 和 String 类型的值可以比较,所以类型为(Int, String)的元组也可以比较。相反,Bool 不能被比较,也意味着存在有布尔类型的元组不能被比较。

  比较元组大小会按照从左至右、逐值比较的方式,直到发现有两个不等时停止。如果所有的值都相等,那么这一对元组我们就称它们是相等的。例如:

  (1, "zebra")< (2, "apple") // ture 2 > 1

  (3, "apple") < (3, "bird") // true apple < bird

  (4, "dog") == (4, "dog") // ture

  在上面的例子中,你可以看到,在第一行中从左至右的比较行为。因为 1 小于 2,所以(1, "zebra")小于 (2,"apple"), 不管元组剩下的值如何。所以 “zebra” 小于 "apple" 没有任何影响,因为元组的比较已经被第一个元素决定了。不过,当元组的第一个元素相同时候,第二个元素将会用作比较,第二行和第三行代码就发生了这样的比较。

  注意:

  swift 标准库只能比较七个以内元素的元组比较函数。如果你的元组元素超过七个时,你需要自己实现比较运算符。

  三目运算符(Ternary Conditional Operator)

  三目运算符的特殊在于它是有三个操作数的运算符,它的形式是 问题?答案1: 答案2。它简洁地表达根据 问题 成立与否作出二选一的操作。如果问题成立,返回答案1的结果,反之返回 答案2 的结果。

  三目运算符是以下代码的缩写形式:

  if question {

    answer1

  } else {

    answer2

  }

  三目运算符提供有效率且便捷的方式来表达二选一的选择。需要注意的事,过度使用三目运算符会使简洁的代码变的难懂。我们应避免在一个组合语句中使用多个三目运算符。

  空合运算符

  空合运算符(a ?? b)将对可选类型 a 进行空判断,如果 a 包含一个值就进行解封,否则就返回一个默认值 b。表达式 a 必须是 Optional 类型。默认值 b 的类型必须要和 a 存储值的类型保持一致。

  空合运算符是对以下代码的简短表达方法:

  a != nil? a!: b

  上述代码使用了三目运算符。当可选类型 a 的值不为空时,进行强制解封(a!),访问 a 中的值;反之返回默认值 b。无疑空合运算(??)提供了一种更为优雅的方式去封装条件判断和解封两种行为,显得简洁以及更具可读性。

  注意:

  如果 a 为非空值(non-nil),那么值 b 将不会被计算。这也就是所谓的短路求值。

  下文例子采用空合运算符,实现了在默认颜色名和可选自定义颜色名之间抉择:

  let defaultColorName = "red"

  var userDefinedColorName: String? // 默认值是 nil

  var colorNameToUse = userDefinedColorName ?? defaultColorName

  // userDefinedColorName 的值为空,所以 colorNameToUse 的值为 “red”

  userDefinedColorName 变量被定义为一个可选的 String 类型,默认值为 nil。由于 userDefinedColorName 是一个可选类型,我们可以使用空合运算符去判断其值。在上一个例子中,通过空合运算符为一个名为 colorNameToUse 的变量赋予一个字符串类型初始值。由于 userDefinedColorName 值为空,因此表达式 userDefinedColorName ?? defaultColorName 返回 defaultColorName 的值,即 red。

  另一情况,分配一个非空值(non-nil)给 userDefinedColorName,再次执行空合运算,运算结果为封包在 userDefaultColorName 中的值,而非默认值。

  userDefinedColorName = "green"

  colorNameToUse = userDefinedColorName ?? defaultColorName 

  区间运算符(Range Operators)

  swift 提供了两个方便表达一个区间的值的区间运算符。

  闭区间运算符

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwfwy.html