【问题标题】:Defer block is not executed延迟块未执行
【发布时间】: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 谢谢,此评论比当前答案解释得更好
  • 好吧,那我就给个答案吧!

标签: swift deferred


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 其实,我建议你告诉他先死,甚至在print声明之前。
    猜你喜欢
    • 2012-03-17
    • 2017-02-22
    • 2012-03-29
    • 1970-01-01
    • 2011-01-25
    • 2018-02-25
    • 2011-09-23
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多