3

为什么guard let x = x 在方法内部的行为与外部不同?

下面的示例代码是直接从 Playground 复制而来的。

var x:Int? = 3

func foo(x: Int?) {
    guard let x = x else {
        return
    }

     print(x)  // print "3\n"
}

foo(x)

guard let x = x else { 
  throw NSError(domain: "app", code: 0, userInfo: nil)
}

print(x)  // print "Optional(x)\n"
4

1 回答 1

8

guard语句在其子句中需要一个return, break, continueor 。如果你更正了编译器中的可选项,就会指出这个错误。在函数范围之外使用保护是没有意义的,因为它是为了检查一个条件并在它无效时突破该范围。你会得到错误:throwelsex?.description

guard身体可能不会掉下来。

它在操场(或函数范围之外)有效的唯一方法是抛出错误。

根据文档

保护语句的 else 子句是必需的,并且必须调用一个标有 noreturn 属性的函数,或者使用以下语句之一将程序控制转移到保护语句的封闭范围之外:

  • 返回
  • 休息
  • 继续
于 2015-06-17T02:24:48.153 回答