简介
运算符是检查、改变、合并值的特殊符号或短语。例如,加号
+
将两个数相加(如let i = 1 + 2
)。更复杂的运算例子包括逻辑与运算符&&
(如a = 10 && b > 20
),或让i
值加1的便捷自增运算符++i
等。Swift 支持大部分标准 C 语言的运算符,且改进许多特性来减少常规编码错误。如:赋值符(
=
)不返回值,以防止把想要判断相等运算符(==
)的地方写成赋值符导致的错误。算术运算符(+
,-
,*
,/
,%
等)会检测并不允许值溢出,以此来避免保存变量时由于变量大于或小于其类型所能承载的范围时导致的异常结果。区别于 C 语言,在 Swift 中你可以对浮点数进行取余运算(
%
),Swift还提供了 C 语言没有的表达两数之间的值的区间运算符(a..<b
和a...b
),这方便我们表达一个区间内的数值。
术语
运算符有一元、二元和三元运算符。
一元运算符对单一操作对象操作(如
-a
)。一元运算符分前置运算符和后置运算符,前置运算符需紧跟在操作对象之前(如!b
),后置运算符需紧跟在操作对象之后(如i++
)。二元运算符操作两个操作对象(如
2 + 3
),是中置的,因为它们出现在两个操作对象之间。三元运算符操作三个操作对象,和
C
语言一样,Swift只有一个三元运算符就是三目运算符(a ? b : c
)。
受运算符影响的值叫操作数,在表达式1 + 2
中,加号+
是二元运算符,它的两个操作数是值1
和2
。
赋值运算符
- 赋值运算符用于为变量或常量指定值,Swift使用
=
作为赋值运算符。通常,使用赋值运算符将一个变量、常量或表达式的值赋给另一个变量(常量只有在声明时才能指定初始值,以后不能为常量赋值)。
// 为变量name赋值为Edward
var name = "Edward"
// 为变量pi赋值为3.1415926
var pi: Double = 3.1415926
// 为变量isLogin赋值为true
var isLogin: Bool = true
- Swift允许使用赋值运算符将一个变量的值赋给另一个变量。
var doctor = "Edward"
var teacher: String = doctor
print(teacher) // 输出 Edward
- 如果赋值的右边是一个多元组,它的元素可以马上被分解成多个常量或变量。
let (width,height) = (375,667)
print("width is '\(width)',height is '\(height)'.") // 输出 width is '375',height is '667'.
- Swift的赋值表达式没有返回值,因此Swift不支持连续赋值。
var a: Int
var b = a = 20 // 工程发出警告
let x = 1,y = 2
if x = y {
// 此句错误,因为 x = y 并不返回任何值
}
这个特性使你无法把(==
)错写成(=
),由于if x = y
是错误代码,Swift可避免此类错误的的发生。
算术运算符
Swift支持所有的基本算术运算符,这些算术运算符用于执行基本的数学运算:加(
+
),减(-
),乘(*
),除(/
),求余(%
)等。+
:加法运算符
let a = 10,b = 20
let sum = a + b
print("sum is '\(sum)'.") // 输出 sum is '30'.
注意:
+
还可作为字符串的连接运算符。
-
:减法运算符
let a = 10,b = 20
let sub = b - a
print("sub is '\(sub)'.") // 输出 sub is '10'.
*
:乘法运算符
let a = 10,b = 20
let multiply = a * b
print("multiply is '\(result)'.") // 输出 multiply is '200'.
/
:除法运算符除法运算符有些特殊,如果除法运算符的两个操作数都是整数类型,则计算结果也是整数类型,就是将自然除法的结果截断取整,例如
19/4
的结果是4
,不是5
。如果除法运算符的两个操作数都是整数类型,则除数不可以是0,否则编译将会报错。如果除法运算符的两个操作数有一个是浮点数,或者两个都是浮点数,则计算结果也是浮点数,这个结果就是自然除法的结果。而且此时允许除数是
0
或0.0
,得到的结果是正无穷大或负无穷大。
%
:求余运算符求余运算(
a % b
)是计算b
的多少倍刚刚好可以容入a
,返回多出来的那部分(余数
)。Swift的求余运算符完全支持对浮点数求余。
var remainderA = 3 % 2
print("remainderA is '\(remainderA)'.") // 输出 remainderA is '1'.
var remainderB = 5.2 % 3.1
print("remainderB is '\(remainderB)'.") // 输出 remainderB is '2.1'.
注意:求余运算符的结果的正负完全取决于被除数,只要被除数是正数,不管除数是正还是负,起求余结果一定是正数;反之亦然。
自增和自减运算
- Swift 也提供了对变量本身加1或减1的自增(
++
)和自减(--
)的缩略算符。其操作对象可以是整型和浮点型。
var number = 10
print("number++ = \(number++)") // 输出 number++ = 10
print("number-- = \(number--)") // 输出 number-- = 11
- 当
++
前置的时候,先自增再返回;当++
后置的时候,先返回,再自增。
let number = 10
let result1 = number++
let result2 = ++number
print("result1 = \(result1),number = \(number). ") 输出 result1 = 10,number = 12.
print("result2 = \(result2),number = \(number). ") // 输出 result2 = 12,number = 12.
一元运算符
- 一元运算符是可以使用前缀
-
或+
。-
表示取反,+
表示求正。
符合运算符
+=
:对于x += y
相当于x = x + y
-=
:对于x -= y
相当于x = x - y
*=
:对于x *= y
相当于x = x * y
/=
:对于x /= y
相当于x = x / y
%=
:对于x %= y
相当于x = x % y
比较运算符
等于(
a == b
)不等于(
a != b
)大于(
a > b
)小于(
a < b
)大于等于(
a >= b
)小于等于(
a <= b
)
注意:Swift也提供恒等
===
和不恒等!==
这两个比较符来判断两个对象是否引用同一个对象实例。
- 每个比较运算都返回了一个标识表达式是否成立的布尔值:
2 == 1 // false
2 != 1 // true
2 > 1 // true
2 < 1 // false
2 >= 1 // true
2 <= 1 // false
- 比较运算符多用于条件语句,如
if
语句。
let isLogin = true
if isLogin == true {
print("已登录!")
}else {
print("未登录!")
}
// 输出已登录
三目运算符
- 三目运算符只有一个:
? :
,三目运算符的语法格式如下:
(expression)? : if-true-statement : if-false-statement
三目运算符的规则是:先对逻辑表达式expression求值,如果逻辑表达式返回真,则执行并返回第二个操作数的值;如果逻辑表达式返回假,则执行并返回第三个操作数的值。
三目运算符是一下代码的缩写形式:
if expression {
if-true-statement
}else {
if-false-statement
}
- 三目运算符运用示例:
let isLogin = true
isLogin ? print("已登录!") : print("未登录!") // 输出 已登录!
- 上述例子中,程序首先会判断
isLogin
的是否为真,如果为真,执行print("已登录!")
,否则执行print("未登录!")
。由于isLogin
在赋值时为true
,因此执行print("已登录!")
,打印已登录!
。
nil合并运算符
Swift提供了nil合并运算符:
??
,其用法为:a ?? b
。??
运算符的功能是判断可选类型变量a
是否为nil
,如果a
不为nil
,程序将会返回可选变量a
所包装的实际值;如果a
为nil
,程序将会返回默认值b
。使用该运算符要求b
的类型必须与a
所包装的类型一致。
let str: String? = "123"
print(str ?? "没有值!") // 输出 123
a ?? b
相当于a != nil ? a! : b
。
注意:
??
运算符的前一个操作数不是可选类型也是允许的,但通常没有意义,如果第一个操作数不是可选类型,程序就没有必要使用??
进行判断了。
区间运算符
- Swift 提供了两个方便表达一个区间的值的运算符。
闭区间运算符
- 闭区间运算符
a...b
用于定义一个从a~b(包括a、b边界值)的所有值的范围,对于闭范围运算符而言,a不能大于b。闭区间运算符在迭代一个区间的所有值时是非常有用的,如在for-in
循环中:
for i in 1...5 {
print("5 * \(i) = \(5 * i)")
}
// 输出结果如下
// 5 * 1 = 5
// 5 * 2 = 10
// 5 * 3 = 15
// 5 * 4 = 20
// 5 * 5 = 25
半开区间运算符
// 创建一个数组
let numbers = [1,2,3,4,5]
// for-in遍历数组
for var index in 0..<numbers.count {
print(numbers[index])
index++
}
// 依次打印:1、2、3、4、5
逻辑运算符
逻辑运算符用于操作布尔型的变量、常量或表达式,逻辑运算的返回值是布尔值。
Swift的常用逻辑运算符主要由如下3个:
逻辑非(
!a
):只需一个操作数,如果操作数为true
,则返回false
;否则返回true
。逻辑与(
a && b
):前后两个操作数必须都是true
才返回true
;否则返回false
。逻辑或(
a || b
):只要两个操作中有一个为true
,就可以返回true
;否则返回false
。
逻辑非
逻辑非运算(
!a
)对一个布尔值取反,使得true
变false
,false
变true
。它是一个前置运算符,需紧跟在操作数之前,且不加空格。读作
非 a
,例子如下:
let isLogin = true
print(!isLogin) // 输出false
逻辑与
- 逻辑与(
a && b
 )表达了只有a
和b
的值都为true
时,整个表达式的值才会是true
,例子如下:
let account = true
let password = true
if account && password {
print("登陆成功!")
}else {
print("登陆失败!")
}
// 输出 登陆成功!
逻辑或
- 逻辑或(
a || b
)是一个由两个连续的|
组成的中置运算符。它表示了两个逻辑表达式的其中一个为true
,整个表达式就为true
,例子如下:
let fingerprint = true
let headPortrait = false
if fingerprint || headPortrait {
print("验证成功!")
}else {
print("验证失败!")
}
// 输出 验证成功!
逻辑运算符的组合计算与优先级
- 我们可以组合多个逻辑运算来表达一个复合逻辑,由于 Swift 逻辑操作符
&&
和||
是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。为了一个复杂表达式更容易读懂,在合适的地方使用括号来明确优先级是很有效的,虽然它并非必要的,例子如下:
let enteredDoorCode = true
let passedRetinaScan = false
let hasDoorKey = false
let knowsOverridePassword = true
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword { print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 输出 "Welcome!"