- 合并空值运算符(a ?? b) 如果可选项 a 有值则展开,如果没有值,是nil,则返回默认值b
- 表达式 a 必须是一个可选类型,表达式b 必须与a 的存储类型相同
- 合并空值运算符,实际上是三元运算符作用到 Optional 上的缩写 (a != nil ? a! : b)
- 如果 a 的值是非空,b的值将不会被考虑,也就是合并空值运算符是短路的
区间运算符
- 闭区间运算符(a...b)定义了从 a 到 b 的一组范围,并且包含 a 和 b,a的值不能大于b
for index in 1...5 {
print("\(index) times 5 is \(index * 5)")
}
- 半开区间运算符(a..<b)定义了从 a 到 b 但不包括b 的区间
- 如同闭区间运算法,a的值也不能大于b,如果a == b,那返回的区间将会为空
let names = ["张三", "李四", "王二", "麻子"]
let count = names.count
for index in 0..<count {
print("person \(index) is called \(names[index])")
}
- 闭区间有另外一种形式来让区间朝一个方向尽可能的远,这种区间叫做单侧区间
- 半开区间运算符同样可以有单侧形式,只需要写他的最终值
for name in names[2...] {
print(name)
}
print("------------")
for name in names[...2] {
print(name)
}
print("------------")
for name in names[..<2] {
print(name)
}
- 单侧区间可以在其他上下文中使用,不仅仅是下标
- 不能遍历省略了第一个值的单侧区间,因为遍历根本不知道该从哪里开始,你可以遍历省略了最终值的单侧区间
let range = ...5
range.contains(7) //false
range.contains(4) //true
range.contains(-1) //true
- 字符串范围也可以使用区间运算符
var welcome = "hello world"
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
print(welcome)
- 通过reversed()方法,我们可以将一个正序循环变成逆序循环
for index in (1...6).reversed() {
print(index)
}
- 区间运算符可以作用在Comparable 类型上,返回闭区间和半闭区间
var welcome = "hello,world!"
let intervar = "a"..."z"
for char in welcome {
if !intervar.contains(String(char)) {
print("\(char)不是小写字母")
}
}
网友评论