import Foundation
/*术语***********************************************/
/*赋值运算符***********************************************/
//赋值运算( 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 默认情况下不允许在数值运算中出现溢出情况。但是你可以使用 Swift 的溢出运算符来实现溢出运算(如 a &+ b )。详情参见溢出运算符 (页 0)。
//加法运算符也可用于 String 的拼接: "hello," + "world" // 等于 "hello,world"
let c = "hello,"+"world"
print(c)
//在对负数 b 求余时,b 的符号会被忽略。这意味着 a % b 和 a % -b 的结果是相同的。
//不同于 C 语言和 Objective-C,Swift 中是可以对浮点数进行求余的。
let d = 8 % 2.5 // 等于 0.5
print(d)
//当 ++ 前置的时候,先自増再返回。
//当 ++ 后置的时候,先返回再自增。
//例如:
var a1 = 0
let b1 = ++a1 // a1 和 b1 现在都是 1
let c1 = a1++ // a1 现在 2,但 c1 是 a1 自增前的值 1
//除非你需要使用 i++ 的特性,不然推荐你使用 ++i 和 --i,因为先修改后返回这样的行为更符合我们的逻辑。
/*复合赋值***********************************************/
//复合赋值运算没有返回值,let b = a += 2 这类代码是错误。这不同于上面提到的自增和自减运算符。
/*比较运算符***********************************************/
1 == 1 // true,因为 1 等于 1
2 != 1 // true,因为 2 不等于 1
2 > 1 // true,因为 2 大于 1
1 < 2 // true,因为 1 小于2
1 >= 1 // true,因为 1 大于等于 1
2 <= 1 // false,因为 2 并不小于等于 1
/*三目运算符***********************************************/
//这里有个计算表格行高的例子。如果有表头,那行高应比内容高度要高出50点;如果没有表头,只需高出20点:
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20) // rowHeight 现在是 90
/*空合运算符***********************************************/
//空合运算符( a ?? b )将对可选类型 a 进行空判断,如果 a 包含一个值就进行解封,否则就返回一个默认值 b .这个运算符有两个条件:
//? 表达式 a 必须是Optional类型
//? 默认值 b 的类型必须要和 a 存储值的类型保持一致
//下文例子采用空合并运算符,实现了在默认颜色名和可选自定义颜色名之间抉择:
let defaultColorName = "red"
var userDefinedColorName: String? //默认值为 nil
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName 的值为空,所以 colorNameToUse 的值为 "red"
// 即如下表达式的简写
//var colorNameToUse = userDefinedColorName != nil ? userDefinedColorName! : defaultColorName
print(colorNameToUse)
//另一种情况,分配一个非空值( non-nil )给 userDefinedColorName,再次执行空合运算,运算结果为封包在 serDefaultColorName 中的值,而非默认值。
userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
print(colorNameToUse)
// userDefinedColorName 非空,因此 colorNameToUse 的值为 "green"
/*区间运算符***********************************************/
//闭区间运算符( a...b )定义一个包含从 a 到 b (包括 a 和 b )的所有值的区间,b 必须大于等于 a 。 ? 闭区 间运算符在迭代一个区间的所有值时是非常有用的,如在 for-in 循环中:
for index in 1...5 {
print("\(index) * 5 = \(index * 5)")
}
//半开区间( a..<b )定义一个从 a 到 b 但不包括 b 的区间。 之所以称为半开区间,是因为该区间包含第一个值 而不包括最后的值。
for index in 1..<5 {
print("\(index) * 5 = \(index * 5)")
}
let j = 10
let j2 = 20
for index in j..<j2 {
print("====\(index) * 5 = \(index * 5)")
}
//半开区间的实用性在于当你使用一个从0开始的列表(如数组)时,非常方便地从0数到列表的长度。
let names = ["Anna","Alex","Brian","Jack"]
for i in 0..<names.count {
print("第 \(i + 1) 个人叫 \(names[i])")
}
/*逻辑运算***********************************************/
//逻辑非运算( !a )对一个布尔值取反,使得 true 变 false,false 变 true 。
//它是一个前置运算符,需紧跟在操作数之前,且不加空格。读作 非 a,例子如下:
let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// 输出 "ACCESS DENIED"
//逻辑与(a && b)表达了只有 a 和 b 的值都为 true 时,整个表达式的值才会是 true 。
//只要任意一个值为 false,整个表达式的值就为 false 。事实上,如果第一个值为 false,那么是不去计算第二 个值的,因为它已经不可能影响整个表达式的结果了。这被称做“短路计算
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出 "ACCESS DENIED"
//逻辑或( a || b )是一个由两个连续的 | 组成的中置运算符。它表示了两个逻辑表达式的其中一个为 true,整个 表达式就为 true 。
//同逻辑与运算类似,逻辑或也是“短路计算”的,当左端的表达式为 true 时,将不计算右边的表达式了,因为它 不可能改变整个表达式的值了。
let hasDoorKey = false
let knowsOverridePassword = true
if (hasDoorKey || knowsOverridePassword) {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出 "Welcome!"
// Swift 逻辑操作符 && 和 || 是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的 子表达式。
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword { print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出 "Welcome!"
//如果我们输入了正确的密码并通过了视网膜扫描,或者我们有一把有效的钥匙,又或者我们知道紧急情况下重置的密码,我们就能把门打开进入。
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword { print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出 "Welcome!"