我在操场上执行以下快速代码:
func A() {
print ("Hello")
guard 1 == 2 else {
return
}
defer {
print ("World")
}
}
A()
我希望看到
Hello
World
而是仅打印Hello
。为什么是这样?我错过了什么?
这是一个更好的例子:
enum MyError: ErrorType {
case TriggerDefer
}
func throwsMyError() throws {
let myzero = Int(arc4random_uniform(1))
guard myzero > 1 else {
throw MyError.TriggerDefer
}
}
func A() throws {
try throwsMyError()
defer {
print ("Hello World")
}
}
enum MyError: ErrorType {
case TriggerDefer
}
func throwsMyError() throws {
let myzero = Int(arc4random_uniform(1))
print("Hello")
guard myzero > 1 else {
throw MyError.TriggerDefer
}
}
func A() throws {
defer {
print ("World")
}
try throwsMyError()
}
现在输出
Hello
World
答案 0 :(得分:5)
在退出范围之前放置defer
块:
func A() {
print ("Hello")
defer {
print ("World")
}
guard 1 == 2 else {
return
}
}
A()
答案 1 :(得分:4)
你遗失的是defer
不是魔术。它是可执行代码,就像任何其他代码一样。如果执行路径从未遇到过,那么就没有什么可以推迟的了。这就是为什么它应始终 dead first 在要执行其退出的块中 - 以便我们保证它