本篇目标

掌握 Swift 中的各类运算符,理解条件语句、循环语句和流程控制,能编写带逻辑判断和循环的 Swift 代码。

一、算术运算符

let a = 10
let b = 3

print(a + b)   // 13
print(a - b)   // 7
print(a * b)   // 30
print(a / b)   // 3(整数除法)
print(a % b)   // 1(取余)

浮点数除法:

let x = 10.0
let y = 3.0
print(x / y)   // 3.3333333333333335

注意:

  • 整数除法会舍去小数部分。

  • 取余 % 对负数也有定义,但结果符号与被除数一致。

  • Swift 不允许不同类型直接运算,需要先转换。

二、比较运算符

let a = 10
let b = 3

print(a == b)   // false
print(a != b)   // true
print(a > b)    // true
print(a < b)    // false
print(a >= b)   // true
print(a <= b)   // false

用于字符串:

let s1 = "apple"
let s2 = "banana"
print(s1 < s2)  // true(按字典序)

三、逻辑运算符

let isOpen = true
let isReady = false

print(!isOpen)           // false
print(isOpen && isReady) // false
print(isOpen || isReady) // true

短路求值:

  • &&:左边为 false,右边不再计算。

  • ||:左边为 true,右边不再计算。

func check() -> Bool {
    print("check 被调用")
    return true
}

let result = false && check()  // check 不会被调用

四、赋值运算符

var a = 10
a += 5   // 等价于 a = a + 5,结果 15
a -= 3   // 12
a *= 2   // 24
a /= 4   // 6
a %= 4   // 2

注意:

  • Swift 的赋值表达式不返回值,不能写成 if (a = 10)。

  • 复合赋值运算符简化代码。

五、区间运算符

闭区间:... 包含两端。

for i in 1...5 {
    print(i)  // 1, 2, 3, 4, 5
}

半开区间:..< 包含左端,不包含右端。

for i in 1..<5 {
    print(i)  // 1, 2, 3, 4
}

单侧区间:

let array = [1, 2, 3, 4, 5]
for item in array[2...] {
    print(item)  // 3, 4, 5
}

for item in array[..<3] {
    print(item)  // 1, 2, 3
}

六、三元运算符

let score = 85
let result = score >= 60 ? "及格" : "不及格"
print(result)  // 及格

嵌套三元(不推荐过度使用):

let grade = score >= 90 ? "A" : score >= 60 ? "B" : "C"

七、条件语句

if

let age = 18

if age >= 18 {
    print("已成年")
} else {
    print("未成年")
}

if-else if-else

let score = 85

if score >= 90 {
    print("优秀")
} else if score >= 60 {
    print("及格")
} else {
    print("不及格")
}

guard

guard 用于提前退出,常用于函数开头。

func greet(name: String?) {
    guard let name = name else {
        print("名字为空")
        return
    }
    print("Hello, \(name)")
}

与 if 的区别:

  • guard 必须带 else,且 else 中必须退出当前作用域。

  • guard 后面的代码可以继续使用解包后的变量。

八、switch

let fruit = "apple"

switch fruit {
case "apple":
    print("苹果")
case "banana":
    print("香蕉")
default:
    print("未知")
}

特点:

  • 不需要 break,自动跳出。

  • 必须穷举所有情况,或加 default。

  • 支持区间、元组、值绑定。

区间匹配:

let score = 85

switch score {
case 90...100:
    print("优秀")
case 60..<90:
    print("及格")
default:
    print("不及格")
}

值绑定:

let point = (2, 0)

switch point {
case (let x, 0):
    print("在 x 轴上,x = \(x)")
case (0, let y):
    print("在 y 轴上,y = \(y)")
default:
    print("其他位置")
}

where 子句:

let number = 12

switch number {
case let n where n % 2 == 0:
    print("偶数")
default:
    print("奇数")
}

九、循环语句

for-in

for i in 1...5 {
    print(i)
}

let names = ["Tom", "Jerry", "Spike"]
for name in names {
    print(name)
}

遍历字典:

let dict = ["a": 1, "b": 2]
for (key, value) in dict {
    print("\(key): \(value)")
}

while

var count = 0

while count < 5 {
    print(count)
    count += 1
}

repeat-while

至少执行一次。

var count = 0

repeat {
    print(count)
    count += 1
} while count < 5

break 与 continue

for i in 1...10 {
    if i == 5 {
        break      // 跳出整个循环
    }
    print(i)       // 1, 2, 3, 4
}

for i in 1...5 {
    if i == 3 {
        continue   // 跳过本次循环
    }
    print(i)       // 1, 2, 4, 5
}

带标签的循环:

outer: for i in 1...3 {
    for j in 1...3 {
        if j == 2 {
            continue outer
        }
        print("\(i), \(j)")
    }
}

十、避坑指南

  • 整数除法会丢精度:需要小数时先转 Double。

  • switch 必须穷举:否则编译器报错。

  • guard 的 else 必须退出:return、break、continue、throw 等。

  • for-in 中不要修改集合:可能导致运行时错误。

  • 三元运算符不要嵌套太深:影响可读性。

  • 逻辑运算符短路:注意副作用函数的调用顺序。

十一、检查清单

  • [ ] 掌握算术、比较、逻辑运算符

  • [ ] 能使用赋值和区间运算符

  • [ ] 会使用 if、guard、switch

  • [ ] 掌握 for-in、while、repeat-while

  • [ ] 会使用 break、continue 和带标签循环

  • [ ] 理解短路求值