Swift 延迟块未执行
我在操场上执行以下swift代码:Swift 延迟块未执行,swift,deferred,Swift,Deferred,我在操场上执行以下swift代码: func A() { print ("Hello") guard 1 == 2 else { return } defer { print ("World") } } A() 我希望看到 Hello World 相反,只打印Hello。为什么会这样?我错过了什么 下面是一个更好的例子: enum MyError: ErrorType {
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")
}
}
根据答案和评论,正确的方法是 现在输出将是
Hello
World
在退出作用域之前,放置
延迟
块:
func A() {
print ("Hello")
defer {
print ("World")
}
guard 1 == 2 else {
return
}
}
A()
在退出作用域之前,放置
延迟
块:
func A() {
print ("Hello")
defer {
print ("World")
}
guard 1 == 2 else {
return
}
}
A()
你所缺少的是,
defer
不是魔术。它是可执行代码,就像任何其他代码一样。如果执行的路径从未遇到它,那么就没有什么可以推迟的。这就是为什么在要执行它的退出的块中,它总是先死的原因,这样我们就可以保证遇到它。您缺少的是,延迟
不是魔术。它是可执行代码,就像任何其他代码一样。如果执行的路径从未遇到它,那么就没有什么可以推迟的。这就是为什么在要执行它的退出的块中,它应该总是死在第一位的原因,以便我们保证它会遇到。实际上,我建议你告诉他先死,甚至在打印语句之前。实际上,我建议你告诉他先死,甚至在print
语句之前。您缺少的是defer
并不是魔术。它是可执行代码,就像任何其他代码一样。如果执行的路径从未遇到它,那么就没有什么可以推迟的。这就是为什么它总是死在第一个要执行它的块中。@matt谢谢,这个评论比当前的答案解释得更好。那么我将给出一个答案!你所缺少的是,defer
不是魔术。它是可执行代码,就像任何其他代码一样。如果执行的路径从未遇到它,那么就没有什么可以推迟的。这就是为什么它总是死在第一个要执行它的块中。@matt谢谢,这个评论比当前的答案解释得更好。那么我将给出一个答案!