Some languages have a concept of try/finally
which lets you tell your app "no matter what happens, I want this code to be executed." Swift 2 introduced its own take on this requirement using the defer
keyword: it means "I want this work to take place, but not just yet." In practice, this usually means the work will happen just before your method ends, but here's the cool thing: this will still happen if you throw an error.
First, a simple example:
override func viewDidLoad() {
super.viewDidLoad()
print("Checkpoint 1")
doStuff()
print("Checkpoint 4")
}
func doStuff() {
print("Checkpoint 2")
defer { print("Do clean up here") }
print("Checkpoint 3")
}
If you run that, you'll see "Checkpoint 1", "Checkpoint 2", "Checkpoint 3", "Do clean up here", then "Checkpoint 4". So, even though the defer
line appears before checkpoint 3, it gets executed after – it gets deferred until the method is about to end.
I put "Do clean up code here" in there because that's exactly what defer
is good at: when you know you need to flush a cache, write out a file or whatever, and you want to make sure that code gets executed regardless of what path is taken through your method.
As I said, work you schedule with defer
will execute no matter what route your code takes through your method, and that includes if you throw any errors. For example:
override func viewDidLoad() {
super.viewDidLoad()
print("Checkpoint 1")
do {
try doStuff()
} catch {
print("Error!")
}
print("Checkpoint 4")
}
func doStuff() throws {
print("Checkpoint 2")
defer { print("Do clean up here") }
throw MyError.UserError
print("Checkpoint 3")
}
As soon as doStuff()
throws its error, the method is exited and at that point the deferred code is called.
SAVE 50% All our books and bundles are half price for Black Friday, so you can take your Swift knowledge further without spending big! Get the Swift Power Pack to build your iOS career faster, get the Swift Platform Pack to builds apps for macOS, watchOS, and beyond, or get the Swift Plus Pack to learn advanced design patterns, testing skills, and more.
Download all Swift 2.0 changes as a playground Link to Swift 2.0 changes
Link copied to your pasteboard.