【问题标题】:How to break out of a guard statement outside of a function?如何打破函数外部的保护语句?
【发布时间】:2018-09-26 19:28:11
【问题描述】:

我正在操场上运行一些代码。

var  optional:  Int?
guard let unwrapped = optional else {
    print("optional is nil")
    return
}
print("Optional is not nil”)

使用此当前代码,我收到一条错误消息,提示“在 func 之外返回无效”。如果我将return 替换为break,我会收到一条错误消息,指出break 只允许在循环或开关内部。如果我在 print 语句之后没有任何其他语句,我会收到一条错误消息,提示“保护体不能通过,考虑使用 return 或 throw 退出范围”。

【问题讨论】:

    标签: swift optional swift-playground


    【解决方案1】:

    在顶层你可以使用fatalError() 来终止执行:

    var  optional:  Int?
    guard let unwrapped = optional else {
        fatalError("optional is nil")
    }
    print("Optional is not nil!")
    

    这允许程序编译。执行它会显示一个

    错误:执行被中断

    在“致命”线上,并且

    致命错误:可选为 nil:文件 MyPlayground.playground,第 5 行

    显示在控制台中。

    【讨论】:

      【解决方案2】:

      guard 用于在条件不满足时退出当前作用域。您可以使用returnthrow 退出函数,或使用breakcontinue 退出当前循环。问题是,你没有退出的余地。

      如果您想在顶层 Playground 中使用 guard 而不会崩溃(有关崩溃的解决方案,请参阅 Martin R's answer),您可以将语句包装在 repeat-while false 循环中以执行一次,然后使用breakguardelse 子句中:

      var  optional:  Int?
      repeat {
          guard let unwrapped = optional else {
              print("optional is nil")
              break
          }
          print("Optional is not nil, has value \(unwrapped)")
      } while false
      

      或者如 Martin R 在 cmets 中建议的那样,使用 label: do { } 范围和 break label

      var  optional:  Int?
      checkNil: do {
          guard let unwrapped = optional else {
              print("optional is nil")
              break checkNil
          }
          print("Optional is not nil, has value \(unwrapped)")
      }
      

      【讨论】:

      • 一个(不一定更好)替代方案是 label: do { ... } 范围和 break label
      • 感谢@MartinR,我将其添加到答案中。
      【解决方案3】:

      您可以使用exit(_: Int) 退出进程。这样就有了你想要的效果。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 1970-01-01
        • 2018-03-03
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多