Guard 语句
A guard statement is used to transfer program control out of a scope if one or more conditions aren’t met.
如果一个或者多个条件不成立,可用 guard 语句来退出当前作用域 (guard所在的作用域)。
Statement Form 语句格式
guard condition1, condition2, ... else {
statements
}
The value of any condition in a guard statement 条件的结果值
- Bool 类型
- Bool 的桥接类型
- Optional Binding (constants or variables)
怎样结束 ? 只能使用 return ?
1. return
是最常用, 最直接的结束方式, 几乎没有使用限制
fetchData { [weak self] data in
guard let self = self else { return }
...
}
2. break
如果你在 guard 语句中像使用 return 一样使用 break, 那么你通常会得到这样的 Error 信息:
❌ ‘break’ is only allowed inside a loop, if, do, or switch.
switch status {
case normal:
...
case highlight:
guard condition else {
...
break
}
default:
...
} // break后直接退出此作用域
3. continue
如果你在 guard 语句中像使用 return 一样使用 contunue, 那么你通常会得到这样的 Error 信息:
❌ ‘continue’ is only allowed inside a loop
4. throw
5. 调用返回类型是 Never 的函数1
作用域的结束
当 return 被执行, 程序只是退出guard所在的作用域
, guard所在的方法或者函数并不一定结束, 很多人没有意识到这一点 !
import UIKit
import Darwin
var greeting = "Hello, SQI~"
func fetchData(_ completion: (Any?, Error?) -> Void) {
print("[invoke] [func] \(#function)")
sleep(1)
completion(greeting, nil)
}
func testRun() {
print("[start] [invoke] [func] \(#function)")
fetchData { data, _ in
print("[invoke] [block] [start] \(#function), data is \(data ?? "")")
guard false else {
print("[invoke] [block] [guard return] \(#function)")
break
}
print("[invoke] [block] [end] \(#function), data is \(data ?? "")")
}
// 会打印 !
print("[end] [invoke] [func] \(#function)")
}
testRun()
func testRun() {
print("[start] [invoke] [func] \(#function)")
DispatchQueue.global().async {
print("[invoke] [block] [start] \(#function), greeting is \(greeting)")
guard false else {
print("[invoke] [block] [guard return] \(#function)")
return
}
print("[invoke] [block] [end] \(#function)")
}
print("[end] [invoke] [func] \(#function)")
}
testRun()
参考
Functions that Never Return ↩︎