- 赋值符(
=
)不再有返回值。(避免了手误将(==
)写成(=
)不报错的问题) - 算术运算符(
+
,-
,*
,/
,%
等)的结果,会被检查是否值溢出(实现允许溢出) - Swift 提供 C 没有的区间运算符,如
a..<b
或a...b
,表达一个区间内的数值 - 本章节只讲基本运算符,自定义运算符、运算符重载请看高级运算符
术语(Terminology)
-
一元运算符(操作一个目标)
- 前置运算符:如
!b
- 后置运算符:如
c!
- 前置运算符:如
-
二元运算符(操作两个目标)
- 如
2 + 3
- 如
-
三元运算符(操作三个目标)
- 和 C 语言一样,Swift 只有一个三元运算符,就是三目运算符(
a ? b : c
)
- 和 C 语言一样,Swift 只有一个三元运算符,就是三目运算符(
赋值运算符(Assignment Operator)
- 赋值元祖
let (x, y) = (1, 2)
// 现在 x 等于 1,y 等于 2
- 与 C 语言和 Objective-C 不同,Swift 的赋值操作并不返回任何值
- 避免把 (
==
)错写成(=
)这类错误的出现
if x = y {
// 此句错误,因为 x = y 并不返回任何值
}
算术运算符(Arithmetic Operators)
- (所有数值类型)都支持了四则算术运算符
- 加法(
+
) - 减法(
-
) - 乘法(
*
) - 除法(
/
)
- 加法(
- 加法运算符也可用于
String
的拼接:
"hello, " + "world" // 等于 "hello, world"
求余运算符
- 求余(remainder)运算符(
%
)在其他语言也叫取模(modulo)运算符
9 % 4 // 等于 1
-9 % 4 // 等于 -1
- 对负数
b
求余时,b
的符号会被忽略。这意味着a % b
和a % -b
的结果是相同的
一元负号运算符
let three = 3
let minusThree = -three // minusThree 等于 -3
let plusThree = -minusThree // plusThree 等于 3, 或 "负负3" = 3
一元正号运算符
let minusSix = -6
let alsoMinusSix = +minusSix // alsoMinusSix 等于 -6
组合赋值运算符
- 组合加运算(
+=
)
var a = 1
a += 2
// a 现在是 3
复合赋值运算没有返回值,
let b = a += 2
这类代码是错误
更多 Swift 标准库运算符的信息,请看 运算符声明。
比较运算符(Comparison Operators)
支持以下的比较运算符:
- 等于(
a == b
) - 不等于(
a != b
) - 大于(
a > b
) - 小于(
a < b
) - 大于等于(
a >= b
) - 小于等于(
a <= b
)
let name = "world"
if name == "world" {
print("hello, world")
} else {
print("I'm sorry \(name), but I don't recognize you")
}
// 输出“hello, world", 因为 `name` 就是等于 "world”
- 字符串相等判断使用 ==(OC中==,表示两个对象的指针变量指向的地址相同)
三元运算符(Ternary Conditional Operator)
- 问题 ? 答案 1 : 答案 2
- 缩写形式:
if question {
answer1
} else {
answer2
}
- 滥用三元运算符会降低代码可读性,避免在一个复合语句中使用多个三元运算符。
空合并运算符(Nil Coalescing Operator)
-
场景:设置/返回 可选类型数据没有值/nil时的默认值
-
空合运算符(
a ?? b
), a有值就解包,否则返回默认值b。 -
a必须是Optional类型,b跟a的存储类型一样(a有值解包后的类型)
-
等价于以下三元运算符的代码:
a != nil ? a! : b
如果
a
为非空值(non-nil
),那么值b
将不会被计算。这也就是所谓的短路求值。
区间运算符(Range Operators)
- 几种方便表达一个区间的值的区间运算符。
闭区间运算符(Closed Range Operator)
-
场景:索引不算0/不是从0开始的情况
-
闭区间运算符(
a...b
)定义一个包含从a
到b
(包括a
和b
)的所有值的区间。a
的值不能超过b
。 -
遍历/迭代
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
半开区间运算符(Half-Open Range Operator)
-
场景:算0的情况
-
半开区间运算符(
a..<b
)定义一个从a
到b
但不包括b
的区间
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
单侧区间(One-Sided Ranges)
-
场景:某个元素开始,到最后一个元素结束
-
一侧无限延伸
for name in names[2...] {
print(name)
}
// Brian
// Jack
for name in names[...2] {
print(name)
}
// Anna
// Alex
// Brian
- 半开区间操作符也有单侧表达形式
for name in names[..<2] {
print(name)
}
// Anna
// Alex
- 单侧区间可以在下标里使用
- 查看一个单侧区间是否包含某个特定的值
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
逻辑运算符(Logical Operators)
- 逻辑运算符操作(修改或合并) 布尔逻辑值 true 和 false
- 与C语言一致
- 逻辑非(
!a
) - 逻辑与(
a && b
) - 逻辑或(
a || b
)
- 逻辑非(
逻辑非运算符(Logical NOT Operator)
- 直接写在要进行运算的值前边,不加空格,读作
非 a
let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// 输出“ACCESS DENIED”
- 避免使用双重逻辑非运算,或混乱的逻辑语句。
逻辑与运算符(Logical AND Operator)
-
(
a && b
)表达了只有a
和b
的值都为true
-
如果第一个值为
false
,那么是不去计算第二个值的,因为它已经不可能影响整个表达式的结果了。这被称做短路计算(short-circuit evaluation)。
逻辑或运算符(Logical OR Operator)
- 逻辑或运算符(
a || b
)是一个由两个连续的|
组成的中置运算符 - 逻辑或也是「短路计算」的,当左端的表达式为
true
时,将不计算右边的表达式了,因为它不可能改变整个表达式的值了。
逻辑运算符组合计算(Combining Logical Operators)
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出“Welcome!”
- 如果我们输入了正确的密码并通过了视网膜扫描,或者我们有一把有效的钥匙,又或者我们知道紧急情况下重置的密码,我们就能把门打开进入。
Swift 逻辑操作符
&&
和||
是左结合的,这意味着拥有多元逻辑操作符的复合表达式,优先计算最左边的子表达式。
使用括号来明确优先级(Explicit Parentheses)
- 使用括号来明确优先级,增加代码可读性
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出“Welcome!”
网友评论