如何打破函数外部的保护语句?

Posted

技术标签:

【中文标题】如何打破函数外部的保护语句?【英文标题】: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 退出范围”。

【问题讨论】:

【参考方案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) 退出进程。这样就有了你想要的效果。

希望这会有所帮助!

【讨论】:

以上是关于如何打破函数外部的保护语句?的主要内容,如果未能解决你的问题,请参考以下文章

Java如何在switch语句下打破while循环?

我如何打破 foreach 语句,回显其他内容然后继续

我打破了React Hook必须按顺序不能在条件语句中调用的枷锁!

错误打破了for循环:条件try语句?

打破一个while循环并重新启动代码

打破简写的if语句[重复]