斯威夫特利用后卫声明破
问题描述:
我想在guard
语句中使用break
,但是编译器告诉我斯威夫特利用后卫声明破
“休息”,只允许在一个循环中,如果这样做,或交换机
可以写这样的代码片段(这只是一个MCV)?
func test(string: String?, x: Int) {
print("Function Scope BEGIN")
if x > 4 {
guard let pr = string else { break }
print(pr)
}
else {
print("Not")
}
print("Function Scope END")
}
答
是的,这是可能的。您可以在循环内使用未标记的break
语句,但不能在if
区块内使用。你可以使用标记break
声明虽然。例如,你的代码的这个版本可以工作:
func test(string: String?, x: Int) {
print("Function Scope BEGIN")
someLabel: if x > 4 {
guard let pr = string else { break someLabel }
print(pr)
}
else {
print("Not")
}
print("Function Scope END")
}
答
一个break
语句只能一个guard let
内部使用,如果后卫-LET是一个循环中。
在你的用例中,我会说你应该使用if-let
来代替,因为return
的替代选项不是我们所期望的。
func test(string: String?, x: Int) {
print("Function Scope BEGIN")
if x > 4 {
if let pr = string { print(pr) }
}
else {
print("Not")
}
print("Function Scope END")
}
+0
如果break语句只能在'guard-let'中使用,那么break语句是不准确的警卫让我们在循环内 –
你认为'break'会做什么? (即'test(nil,x:5)'的预期输出是什么?) – kennytm
你基本上在这里使用'goto'。考虑重构。 – Alexander
@kennytm这不是实际的代码,这是一个例子,预期的结果是不打印pr但打印“Function Scope END” – Andrea