在退货之前,延期声明和声明之间的区别是什么?

Li *_*min 15 ios deferred swift

这有什么区别:

_ = navigationController?.popViewController(animated: true)

defer {
    let rootVC = navigationController?.topViewController as? RootViewVC
    rootVC?.openLink(url: url)
}
return
Run Code Online (Sandbox Code Playgroud)

还有这个:

_ = navigationController?.popViewController(animated: true)

let rootVC = navigationController?.topViewController as? RootViewVC
rootVC?.openLink(url: url)
return
Run Code Online (Sandbox Code Playgroud)

Apple的快速指南说:"在代码执行离开当前代码块之前,使用defer语句执行一组语句.",但我仍然不太明白.

mat*_*att 32

在退货之前,延期声明和声明之间的区别是什么?

世界上所有的差异.该defer声明在返回执行!这使您可以完成可以通过其他方式完成的事情(如我在此演示).

此外,正如已经指出的那样,count无论你如何退出,都会执行该声明.无论你退出当前范围,它都可以工作,这可能根本不涉及count; defer适用于函数体,while块,if结构,do块等.单个return不是退出这样一个范围的唯一方法!defer您的方法中可能有多个,和/或您可能会抛出错误,和/或您可能有return等等,或者您可能只是自然地到达范围的最后一行; 将return在每一个可能的情况下执行."手动"编写相同的代码,以便涵盖每个可能的退出,可能非常容易出错.

  • 你确定在退货后执行延期声明吗?Swift编程语言指南说:"使用defer编写一个代码块,该代码块在函数中的所有其他代码之后执行,就在函数返回之前".它说"在函数返回之前". (8认同)
  • 试图在操场上跑步,退回后没有叫出延迟声明 (2认同)
  • @Shubham是的,这也是我在第三段中所说的。推迟执行是因为我们已经离开,无论如何。请参阅http://www.apeth.com/swiftBook/ch05.html#_defer。您是否遵循链接并对此进行了研究?/sf/answers/2532958851/ (2认同)

vad*_*ian 16

在你的例子中实际上没有区别,但请看这个:

func foo(url: URL) -> Int
    let fileDescriptor : CInt = open(url.path, O_EVTONLY);
    defer {
      close(fileDescriptor)
    }
    guard let bar = something1() else { return 1 }
    guard let baz = something2() else { return 2 }
    doSomethingElse(bar, baz)
    return 3
}
Run Code Online (Sandbox Code Playgroud)

close(fileDescriptor) 无论函数返回哪一行,总是执行.


H S*_*ogr 7

defer语句用于在执行离开最近范围之前执行一段代码.

例如:

func defer()  { 
 print("Beginning") 
 var value: String? 
 defer { 
    if let v = value { 
        print("Ending execution of \(v)")
    } 
 } 
 value = "defer function" 
 print("Ending")
}
Run Code Online (Sandbox Code Playgroud)

将打印的第一行是:开始

将打印的第二行是:结束

将打印的最后一行是:结束延迟功能的执行.