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 都会执行,并且可以防止项目因可能更改范围流的更改而导致错误,从而降低出错的可能性。