2016年2月2日 星期二

Learn swift : 基本運算浮號


本页包含内容:

术语

运算符有一元、二元和三元运算符。
  • 一元运算符对单一操作对象操作(如-a)。一元运算符分前置运算符和后置运算符,前置运算符需紧跟在操作对象之前(如!b),后置运算符需紧跟在操作对象之后(如i++)。
  • 二元运算符操作两个操作对象(如2 + 3),是中置的,因为它们出现在两个操作对象之间。
  • 三元运算符操作三个操作对象,和 C 语言一样,Swift 只有一个三元运算符,就是三目运算符(a ? b : c)。
受运算符影响的值叫操作数,在表达式1 + 2中,加号+是二元运算符,它的两个操作数是值12

赋值运算符

赋值运算(a = b),表示用b的值来初始化或更新a的值:
let b = 10
var a = 5
a = b
// a 现在等于 10
如果赋值的右边是一个多元组,它的元素可以马上被分解成多个常量或变量
let (x, y) = (1, 2)
// 现在 x 等于 1, y 等于 2

与 C 语言和 Objective-C 不同,Swift 的赋值操作并不返回任何值。所以以下代码是错误的
if x = y {
    // 此句错误, 因为 x = y 并不返回任何值
}

浮点数求余计算

不同于 C 语言和 Objective-C,Swift 中是可以对浮点数进行求余的。
8 % 2.5   // 等于 0.5
这个例子中,8除于2.5等于30.5,所以结果是一个Double0.5
Art/remainderFloat_2x.png

  • ++前置的时候,先自増再返回。
  • ++后置的时候,先返回再自增。
例如:
var a = 0
let b = ++a // a 和 b 现在都是 1
let c = a++ // a 现在 2, 但 c 是 a 自增前的值 1

空合运算符(Nil Coalescing Operator)

空合运算符(a ?? b)将对可选类型a进行空判断,如果a包含一个值就进行解封,否则就返回一个默认值b.这个运算符有两个条件:
  • 表达式a必须是Optional类型
  • 默认值b的类型必须要和a存储值的类型保持一致
空合运算符是对以下代码的简短表达方法
a != nil ? a! : b
上述代码使用了三目运算符。当可选类型a的值不为空时,进行强制解封(a!)访问a中值,反之当a中值为空时,返回默认值b。无疑空合运算符(??)提供了一种更为优雅的方式去封装条件判断和解封两种行为,显得简洁以及更具可读性。


下文例子采用空合运算符,实现了在默认颜色名和可选自定义颜色名之间抉择:
let defaultColorName = "red"
var userDefinedColorName: String?   //默认值为 nil

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


闭区间运算符(a...b)定义一个包含从ab(包括ab)的所有值的区间,b必须大于等于a。 ‌ 闭区间运算符在迭代一个区间的所有值时是非常有用的,如在for-in循环中:
for index in 1...5 {
    print("\(index) * 5 = \(index * 5)")
}
// 1 * 5 = 5
// 2 * 5 = 10
// 3 * 5 = 15
// 4 * 5 = 20
// 5 * 5 = 25

半开区间运算符

半开区间(a..<b)定义一个从ab不包括b的区间。 之所以称为半开区间,是因为该区间包含第一个值而不包括最后的值。
半开区间的实用性在于当你使用一个从0开始的列表(如数组)时,非常方便地从0数到列表的长度。
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
    print("第 \(i + 1) 个人叫 \(names[i])")
}
// 第 1 个人叫 Anna
// 第 2 个人叫 Alex
// 第 3 个人叫 Brian
// 第 4 个人叫 Jack

逻辑运算

逻辑运算的操作对象是逻辑布尔值。Swift 支持基于 C 语言的三个标准逻辑运算。
  • 逻辑非(!a
  • 逻辑与(a && b
  • 逻辑或(a || b

逻辑运算符组合计算

我们可以组合多个逻辑运算来表达一个复合逻辑:
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// 输出 "Welcome!"

使用括号来明确优先级

为了一个复杂表达式更容易读懂,在合适的地方使用括号来明确优先级是很有效的,虽然它并非必要的。在上个关于门的权限的例子中,我们给第一个部分加个括号,使它看起来逻辑更明确:
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// 输出 "Welcome!"


Reference : http://wiki.jikexueyuan.com/project/swift/chapter2/02_Basic_Operators.html

沒有留言:

張貼留言