如何打破函数外部的保护语句?
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
用于在条件不满足时退出当前作用域。您可以使用return
或throw
退出函数,或使用break
或continue
退出当前循环。问题是,你没有退出的余地。
如果您想在顶层 Playground 中使用 guard
而不会崩溃(有关崩溃的解决方案,请参阅 Martin R's answer),您可以将语句包装在 repeat-while false
循环中以执行一次,然后使用break
在guard
的else
子句中:
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)
退出进程。这样就有了你想要的效果。
希望这会有所帮助!
【讨论】:
以上是关于如何打破函数外部的保护语句?的主要内容,如果未能解决你的问题,请参考以下文章