不执行延迟块

时间:2016-03-23 03:41:29

标签: swift deferred

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

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

2 个答案:

答案 0 :(得分:5)

在退出范围之前放置defer块:

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

A()

答案 1 :(得分:4)

你遗失的是defer不是魔术。它是可执行代码,就像任何其他代码一样。如果执行路径从未遇到过,那么就没有什么可以推迟的了。这就是为什么它应始终 dead first 在要执行其退出的块中 - 以便我们保证