The defer keyword in Swift is used to execute a block of code at the end of the current scope, regardless of how the scope is exited. The defer block is executed after any return statements, and before any finally blocks.

Here is an typical example of how to use the defer keyword in Swift:

func processFile(filename: String) {
    let file = openFile(filename)
    defer {
        closeFile(file)
    }
    // ...
    // code to process the file
    // ...
}

In this example, the processFile function opens a file using the openFile function, and then it registers a defer block to close the file using the closeFile function. The defer block is executed at the end of the processFile function, regardless of how the function is exited.

The defer keyword can be useful for cleaning up resources, such as closing files or releasing memory, or for performing any other tasks that need to be done before the current scope is exited. It can also help you avoid common pitfalls, such as forgetting to close a file or release a resource, or writing complex and error-prone cleanup code.

Running order

It is also quite important to point it out that the defer blocks are executed in the reverse order in which they are declared, and they are executed only once, even if the current scope is exited multiple times. This can affect the order and behavior of the defer blocks, and it is important to consider these factors when designing and implementing your code. Take a look at the example:

var a = "test"
func processWords(str: inout String) -> String {
  str = "new string" + "."
  defer {
    str = "another new string1 "
  }
  return str
}
print(processWords(str: &a))
print(a)
// output:
new string.
another new string1 

defer 's block code will run after the any return, take another look on this piece of code:

var a = "test"
func processWords(str: inout String) -> String {
  str = "new string" + "."
  return str
  defer {
    str = "another new string1 "
  }
}
print(processWords(str: &a))
print(a)
// output:
new string.
new string.

"another new string1 " is not print out due to the defer is even not declared before the return statement.