不执行延迟块

Defer block is not executed

我在 playground 中执行了以下 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")
    }
}

根据答案和评论,正确的方法(举例)是

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 块:

func A() {
    print ("Hello")
    defer {
        print ("World")
    }
    guard 1 == 2 else {
        return
    }
}

A()

你错过的是defer不是魔法。它是可执行代码,就像任何其他代码一样。如果执行路径从未遇到它,则没有什么可以推迟的。这就是为什么它应该总是先死在它要执行的块中——这样我们保证遇到的