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 {

我在操场上执行以下swift代码:

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谢谢,这个评论比当前的答案解释得更好。那么我将给出一个答案!