原文出自:标哥的技术博客
前言
运算符是检查、改变或合并值的特殊符号或短语。例如:加号+将两个数相加。更复杂的运算例子包括逻辑与运算符&&或让i值加1的便捷自增运算符++i等。
Swift支持大部分标准C语言的运算符,且改进许多特性来减少常规编码错误。例如:赋值符不返回值,以防止把想要判断相等运算符的地方写成赋值符导致的错误。算术运算符(+,-,*,/,%等)会检测并不允许值溢出,以此来避免保存变量时由于变量大于或小于其类型所能承载的范围时导致异常。当然允许你使用Swift的溢出运算符来实现溢出。
与C语言不同的是,在Swift中可对浮点数进行取余运算,还提供C语言没有的表达两数之间的值的区间运算符(a..
术语
运算符有一元、二元和三元运算符:
- 一元运算符对单一目标操作。一元运算符分前置运算符和后置运算符,前置运算符需紧跟在操作对象之前(如!b),后置运算符需紧跟在操作对象之后(如i++)。
- 二元运算符操作两个操作对象,出现在两个操作对象之间。如:(a+b)
- 三元运算符操作三个操作对象,和C语言一样,Swift只有一个三元运算符,就是三目运算符?:。如a ? b : c。
赋值运算符
赋值运算符为=
。如下表示将常量cost
的值赋值给变量totalMoney
:
let cost = 100
var totalMoney = cost
元组也可以使用赋值运算符,如下则x的值为1,y的值为2:
let (x, y) = (1, 2)
赋值运算符不返回值,因此不能用于if语句中直接判断:
// error
if (x = y) {
// 这里只是把y的值赋值给x,但是并不会返回值,因此没有比较,对于if语句就没有返回true或者false
}
算术运算符
Swift为数值类型提供了四个标准的算术运算符:
- 加法(+)
- 减少(-)
- 乘法(*)
- 除法(/)
1 + 2 // 等于3
5 - 1 // 等于4
2 * 2 // 等于4
10.0 / 2.5 //等于4.0
默认是不允许值溢出的,若溢出则会抛出异常。如果要允许溢出,我们可以使用swift提供的溢出运算符,如&+
代表溢出加法。
对于字符串,提供了字符串连接:
// equals "Hello, World"
"Hello, " + "World"
求余运算符
在数学上,求余也叫取模。比如,计算9 % 4:
9 % 4 // 1 <= 9 - (9 / 4) * 4
同样,如果是-9 % 4呢?
-9 % 4 // -1 <= -9 - (-9 / 4) * 4
浮点数求余
在C和Ojbective-C中是不支持浮点数求余的,但是在swift中是支持的。其实浮点数求余与整数求余没有什么特殊的,计算方式是一样的:
8 % 2.5 // 0.5 <= 8 - (8 / 2.5) * 2.5
自增和自减运算符
和C语言一样,Swift也提供了对变量本身加1或减1的自增(++)和自减(–)运算符。其操作目标可以是整形和浮点型。
var i = 0
var a = i++;
如果执行i++
或者++i
- 当++前置的时候,先自増再返回。
a = ++i
<=>i = i + 1, a = i
- 当++后置的时候,先返回再自增。
a = i++
<=>a = i
,i = i + 1
对i--
或者--i
也是一样:
- 当–前置时,先自减再返回。
a = --i
<=>i = i - 1, a = i
- 当–后置时,先返回再自减。
a = i--
<=>a = i, i = i - 1
一元运算符
数值的正负号可以使用前缀-来切换:
let three = 3
let minusThree = -three // minusThree 等于 -3
let plusThree = -minusThree // plusThree 等于 3, 或 "负负3"
在值前面添加正号(+)是不做任何事的:
let three = -3
let anotherThree = +three // -3
组合运算符
Swift提供了组合运算符,如:
- +=
- *=
- /=
- %=
不同的数据类型,其可能已经重载过运算符,计算结果可能不一样。比如Int类型的+=只是简单的数值计算,而字符串的+=则是字符串连接。
比较运算符
Swift支持所有标准C的比较运算符:
- == 判断是否相等
- != 判断是否不相等
- > 是否大于
- < 是否小于
- >= 是否大于或者等于
- <= 是否小于或者等于
- === 判断两个对象是否是同一个引用,应用于类的实例之间
- !== 判断两个对象不是同一个引用,应用于类的实例之间
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
比较运算符更多的情况下是应用于if语句:
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"
三目运算符
三目运算符通常应用于单条件判断,比如判断是否为空:
if str.isEmpty {
return ""
} else {
return str
}
转换成三目运算:
return str.isEmpty ? "" : str
Nil Coalescing Operator
nil合并运算符在开发中是很常用的,对于可选类型,尝试获取值,若没有值则使用默认值。其语法为:a ?? b,它相当于:
a != nil ? a! : b
比如下面的语法,如果customName为nil,则返回defaultName,否则返回customName:
let defaultName = "标哥的技术博客"
var customName: String? //默认值为 nil
return customName ?? defaultName
区间运算符
Swift 提供了两个优雅的表达一个区间的值的运算符:
- a…b,表示[a, b]
- a..
闭合区间
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
左闭右开区间
for index in 1..<5 {
print("\(index) * 5 = \(index * 5)")
}
// 1 * 5 = 5
// 2 * 5 = 10
// 3 * 5 = 15
// 4 * 5 = 20
逻辑运算符
逻辑运算的操作目标是逻辑布尔值。Swift支持基于C语言的三个标准逻辑运算。
- 逻辑非(!)
- 逻辑与(&&)
- 逻辑或(||)
逻辑非(!)
逻辑非其实就是取反,true变成false,false变成true。
let isSucessful = false
if !isSucessful {
print("fail")
}
逻辑与(&&)
逻辑与其实就是当且仅当的意思。只有每个表达式都是true,最终结果才为true,否则结果为false。
if (a && b) {
print("只有a和b都不为nil才会打印这一句")
}
逻辑或(||)
逻辑或其实就是只要存在的意思。只要存在那么一个表达式的结果为true,那么结果就为true,否则为false:
if a || b {
print("只要a或者b不为nil,则此句就会打印出来")
}
逻辑组合
在开发中,往往是多个组合一起的,那么其运算顺序是左结合的,因此从左边开始运算:
if a && b || c || d {
}
但是,在实际开发中,我们要让语意足够清晰,应该这么写:
if (a && b) || c || d {
}
写在最后
本篇博文是笔者在学习Swift 2.1的过程中记录下来的,可能有些翻译不到位,还请指出。另外,所有例子都是笔者练习写的,若有不合理之处,还望指出。
学习一门语言最好的方法不是看万遍书,而是动手操作、动手练习。如果大家喜欢,可以关注哦,尽量2-3天整理一篇Swift 2.1的文章。这里所写的是基础知识,如果您已经是大神,还请绕路!
关注我
如果在使用过程中遇到问题,或者想要与我交流,可加入有问必答QQ群:324400294
关注微信公众号:iOSDevShares
关注新浪微博账号:标哥Jacky
支持并捐助
如果您觉得文章对您很有帮助,希望得到您的支持。您的捐肋将会给予我最大的鼓励,感谢您的支持!
支付宝捐助 | 微信捐助 |
---|---|