Study Notes of guard in Swift

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的特点:

  1. 必有 else
  2. 会引起控制转换 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 能用优雅的代码简洁可读地实现逻辑。

code style reference

Google-Swift Style Guide