运算符

运算符的改进

  • 赋值符号 = 不会返回值,以防被误用于 == 的意图上
  • 算数符号 +, -, *, /, % 以及其他,可以检测并阻止溢出


余数运算符 a % b

  • a 是负数时也是用相同的方法来进行计算
  • b 是负数时,它的正负号被忽略掉了,这意味着 a % ba % -b 能够获得相同的答案

溢出运算符

在默认情况下,当向一个整数赋值超过它容量的值时, Swift 会报错,而不是生成一个无效的数

  • 溢出加法 &+
  • 溢出减法 &-
  • 溢出乘法 &*

数值可以出现向上溢出或向下溢出的情况

下图为无符号溢出


与无符号溢出一样,当出现上溢时,会从最大数,变成最小数。发生下溢时,会从最小数变成最大数

下图为有符号溢出

let num1: UInt8 = 250
let num2 = num1 &+ 1
print(num2)

合并空值运算符

  • a ?? b 如果 a 有值则展开,为 nil 则返回 b
  • 表达式 a 必须是一个可选类型,表达式 b 必须与 a 的存储类型相同
func addTwoNum(num1: Int?, num2: Int?) -> Int {
    return (num1 ?? 0) + (num2 ?? 0)
}

区间运算符

闭区间运算符 a...b 定义了从 ab 的一组范围,并且包含 aba 的值不能大于 b

for index in 1...5{
    print("\(index) times 5 is \(index * 5)")
}

半开区间运算符

a..<b 定义了从 ab 但不包括 b 的区间

同区间运算符, a 的值不能大于 b ,如果 ab 相等,那返回值为空

let name = ["123", "456", "789"]
let count = name.count
for i in 0..<count{
    print("name is \(names[i])")
}

单侧区间

一个包含数组所有元素的区间,从索引 2 到数组的结束。在这种情况下,你可以省略区间运算符一侧的值

从 2~结束

for name in names[2...] {
    print(name)
}

从开始~2

for name in names[...2] {
    print(name)
}

从 0~1

for name in names[..<2] {
    print(name)
}

倒序索引

可以使用 reversed() 方法进行倒序遍历

for i in (0..<10).reversed() {
    print(i)
}

其他

区间运算符可以作用在 Comparable 类型上

let welcome = "hello,world"
let interval = "a"..."z"
for c in welcome {
    if !interval.contains(String(c)) {
        print("\(c) 不是小写字母")
    }
}

位运算

位取反运算符

~ 表示取反

位与运算符

& 表示与运算符

位或运算符

| 表示或运算符

位异或运算符

^ 表示异或运算符

位左、右移运算符

<<>> 表示左、右移运算符


What doesn’t kill you makes you stronger.