guard基本用法
语法:
guard condition else {
//not empty
}
语法结构和 if 类似, 不同的是guard 必带有 else。当 condition 为 false 时, else 分支必会执行。else 分支内必须离开 guard 所处的当前范围,这就是所谓的 “early exit”。这种转换控制,可以使用 continue, throw, break,return 或是调用不会return的函数或方法,如 fatalError 实现。当 condition 为 true 时, 继续执行 else 分支后的部分。condition内声明的变量,在else分支后继续有效。
简单地说,guard的特点:
- 必有 else
- 会引起控制转换 transfer control
简单示例
对于嵌套 if-else 语句的代码,可以使用 guard 增加代码的可读性,避免 “pyramid of dooms”。 举个例子:
func searchInArray(_ values: [Int]) throws -> Int {
if let firstVal = values.first {
if firstVal < 0 {
throw NSError.init(domain: "com.mydomain.guard", code: 302, userInfo: nil)
}else {
return firstVal
}
} else {
throw NSError.init(domain: "com.mydomain.guard", code: 301, userInfo: nil)
}
}
func searchInArray2(_ values: [Int]) throws -> Int {
guard let firstVal = values.first else {
throw NSError.init(domain: "com.mydomain.guard", code: 301, userInfo: nil)
}
guard firstVal >= 0 else {
throw NSError.init(domain: "com.mydomain.guard", code: 302, userInfo: nil)
}
return firstVal
}
写法2优于写法1不仅在于简洁,还在于可读性高。 对于有多个if-else嵌套的情形,比如说,客户端进行多个输入验证的时候,将会极大的简化代码的写法。根据实践,对于含有多种错误处理的情形,使用 guard 能用优雅的代码简洁可读地实现逻辑。
Comments