溢出运算符
在默认情况下,当向一个整数赋超过它容量的值时,Swift 会报错而不是生成一个无效的数,给 我们操作过大或者过小的数的时候提供了额外的安全性。
同时提供三个算数溢出运算符来让系统支持整数溢出运算:
- 溢出加法 ( &+ )
- 溢出减法 ( &- )
- 溢出乘法 ( &* )
合并空值运算符
- 合并空值运算符( a ?? b ), 用
??
表示, 如果可选项 a 有值则展开返回 a,如果没有值,是 nil,则返回值 b 。 - 表达式 a 必须是一个可选类型。表达式 b 必须与 a 的储存类型相同。
- 实际上是三元运算符作用到 可选项 Optional 上的缩写(a != nil ? a! : b)。
- 如果 a 的值是非空的,b 的值将不会被考虑,也就是合并空值运算符是短路的。
注: 表达式 a 必须是一个可选类型。表达式 b 必须与 a 的储存类型相同。该条件是官方文档是注明的,但再实际开发中的时候,b可以是任意类型的,如下图.
再之前的Swift版本中,a的类型在实际开发中也是没有限制的,直到Swift5的时候,是会有提示的, 合并空值运算符??
左侧的a是非可选类型Any
,因此右侧永远不会被使用
![](https://img.haomeiwen.com/i2669907/834480c617baa15f.png)
![](https://img.haomeiwen.com/i2669907/834480c617baa15f.png)
注: 当合并空值运算符右侧是一个函数的时候, 只有当
??
左侧是nil
的时候才会调用合并空值运算符右侧的函数
![](https://img.haomeiwen.com/i2669907/9552e896bb533ba0.png)
![](https://img.haomeiwen.com/i2669907/4ac1e72eb08d7fb3.png)
区间运算符
- 闭区间运算符( a...b )定义了从 a 到 b 的一组范围,并且包含 a 和 b 。a 的值不 能大于 b 。
for index in 1...5 {
print("index = \(index)")
}
// 打印结果
// index = 1
// index = 2
// index = 3
// index = 4
// index = 5
半开区间运算符
- 半开区间运算符( a..<b )定义了从 a 到 b 但不包括 b 的区间。
- 如同闭区间运算符,a 的值也不能大于 b ,如果 a 与 b 的值相等,那返回的区间将 会是空的。
let names = ["公孙离", "李白", "赵云", "孙尚香"]
let count = names.count
for i in 0..<2 {
print("下标:\(i) 名字:\(names[i])")
}
// 打印结果
// 下标:0 名字:公孙离
// 下标:1 名字:李白
单侧区间
- 闭区间有另外一种形式来让区间朝一个方向尽可能的远,这种区间叫做单侧区间。
- 半开区间运算符同样可以有单侧形式,只需要写它最终的值。
- 比如说,一个包含数组所有元素的区间,从索引 2 到数组的结束。在这种情况下,你可 以省略区间运算符一侧的值。
let names = ["公孙离", "李白", "赵云", "孙尚香"]
for name in names[..<3] {
print(name)
}
// 打印结果:
// 公孙离
// 李白
// 赵云
for name in names[2...] {
print(name)
}
// 打印结果:
// 赵云
// 孙尚香
单侧区间
- 单侧区间可以在其他上下文中使用,不仅仅是下标。
- 不能遍历省略了第一个值的单侧区间,因为遍历根本不知道该从哪里开始。你可以遍历省略了最终值的单侧区间。
倒序索引
- 通过 reversed() 方法,我们可以将一个正序循环变成逆序循环。
for index in (1...5).reversed() {
print("index = \(index)")
}
// 打印结果:
// index = 5
// index = 4
// index = 3
// index = 2
// index = 1
Comparable 区间
- 区间运算符可以作用在 Comparable 类型上,返回闭区间和半闭区间。
let welcome = "Hello,world!"
let interval = "a"..."z"
for c in welcome {
if !interval.contains(String(c)) {
print("\"\(c)\" 不是小写字母")
}
}
// 打印结果:
// "H" 不是小写字母
// "," 不是小写字母
// "!" 不是小写字母
网友评论