Swift 中的 Defer 是什么?


在本教程中,您将学习 defer 关键字是什么以及如何在 Swift 中使用它。您将了解在哪些情况下可以使用 defer 关键字。

什么是 defer?

defer 是一个语句,用于在将程序控制权转移到该语句出现的范围之外之前执行代码。

defer 语句不是您在 Swift 中经常需要使用的语句。当您希望在资源超出范围之前清理资源时,它会很有用。defer 关键字是在 Swift 2.0 版本中引入的。

语法

// Initial tasks to execute before exiting the scope

defer {
   // perform cleanup operation here
   // other statements
}
// further code

示例

var languages = ["Swift", "Objective-C", "Kotlin", "JavaScript", "Java"] func removeLastValue() -> String? { let lastValue = languages.last defer { languages.removeLast() } return lastValue } let lastValue = removeLastValue() print("last value: \(lastValue ?? "")") print("Array: \(languages)")

输出

last value: Optional("Java")
Array: ["Swift", "Objective-C", "Kotlin", "JavaScript"]

解释

您可以查看输出,并看到 languages.removeLast() 在上面的示例中的 return 语句之前写入了。在函数执行完成后,defer 语句将被执行并删除最后一个元素。

多个 Defer

如果多个 defer 语句出现在相同的范围内,则它们的执行顺序与其出现的顺序相反。最后定义的语句将首先执行。最近延迟的事物首先运行——有效地展开一个栈。

示例

func testingMultipleDefer() { defer { print("one") } defer { print("two") } defer { print("three") } print("end of function") } testingMultipleDefer()

输出

end of function
three
two
one

Defer 不捕获值

延迟语句不会捕获变量的引用或当前值。

示例

func captureTest() { var fullName = "Mohit Chouhan" defer { print(fullName) } fullName = "Mohit Sharma" print(fullName) } captureTest()

输出

Mohit Sharma
Mohit Sharma

注意 - 我们不能中断 defer 的执行,或者我们不能在 defer 块内部使用 return、continue 或 break。

一个实际的例子

func writeLog() { let file = openFile() defer { closeFile(file) } print("writing all the logs here...") } func openFile() -> String { return "defer_statement.txt" } func closeFile(_ fileName: String) { print("closing file: \(fileName)") } writeLog()

输出

writing all the logs here...
closing file: defer_statement.txt

即使您对已打开的文件进行更改,如果您在函数末尾或函数中间返回或退出此函数,defer 块都会确保文件将被关闭。

关于 defer 需要记住的要点

  • defer 不应该尝试退出当前范围,因为 'return' 就是为此而存在的。

  • 在离开当前范围之前,在 defer 块中执行此类任务(例如清理资源)。

  • 实际上保证无论执行如何离开当前范围,它都会被执行。

  • defer 语句仅在执行离开当前范围时执行,而不是在遇到 defer 语句时执行。

结论

Swift 的 defer 语句在某些情况下对于清理资源非常有用。defer 语句将使您的 iOS 应用程序代码平稳运行,即使团队成员更新方法或添加条件语句。无论我们如何退出,defer 都会执行,并且可以防止项目因可能更改范围流的更改而导致错误,从而降低出错的可能性。

更新于: 2022年11月22日

5K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告