为什么守护让x = x表现出不同的范围行为?

时间:2015-06-17 02:13:21

标签: swift2 guard-statement

为什么防护让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"

1 个答案:

答案 0 :(得分:8)

guard语句在return子句中需要breakcontinuethrowelse。如果更正x?.description中的可选项,编译器将指出此错误。在函数范围之外使用guard是没有意义的,因为它用于检查条件并在该范围无效时突破该范围。你会收到错误:

  

guard身体可能无法通过。

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

根据documentation

  

保护声明的else子句是必需的,必须要么调用   标有noreturn属性或传输程序的函数   使用其中一个来控制守卫声明的封闭范围   以下陈述:

     
      
  • 返回
  •   
  • 休息
  •   
  • 继续
  •   
  •