【发布时间】:2016-03-23 03:41:28
【问题描述】:
我在操场上执行以下快速代码:
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")
}
}
根据答案和 cmets,执行此操作的正确方法(带有示例)是
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
【问题讨论】:
-
您缺少的是
defer不是魔术。它是可执行代码,就像任何其他代码一样。如果执行路径从未遇到它,则没有什么可以推迟的。这就是为什么它应该总是先死在它要被执行的块中。 -
@matt 谢谢,此评论比当前答案解释得更好
-
好吧,那我就给个答案吧!