case .foo:
defer {
baz()
}
fallthrough
case .bar:
在我们进入酒吧场景之前就到达了 baz()。 这是预期的结果还是编译器出错了? 我期望 baz() 在切换结束时被调用 作用域还是函数作用域???!!!
最佳答案
case:
block 的末尾是该 block 范围的末尾...fallthrough
语句不维护范围。
考虑以下因素:
defer { print("outer deferred") }
let t = 1
switch t {
case 0:
print("0")
case 1:
print("1")
defer { print("deferred") }
fallthrough
case 2:
print("2")
default:
print("default")
}
输出将是:
1
deferred
2
outer deferred
现在,考虑一下:
defer { print("outer deferred") }
let t = 1
switch t {
case 0:
print("0")
case 1:
let str = "hello"
print("1")
defer { print("deferred") }
fallthrough
case 2:
print("2")
print(str) // <-- error
default:
print("default")
}
编译器会告诉您 str
是一个未解析的标识符,因为它是在 case 1:
内创建的,但不再在 case 2 的范围内:
.
关于 swift 推迟特殊性 : why is code in case:defer is invoked before the end of the switch scope?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57610020/