// *** before: ***
func readOld(path: String) -> String? {
let file = openFile(path)
guard file.isValid else {
closeFile(file) // the cleanup was repeated at every exit,
return nil // and forgotten at the newest one
}
let text = file.read()
closeFile(file)
return text
}
// *** in version 2.0: ***
func read(path: String) -> String? {
let file = openFile(path)
defer { closeFile(file) } // runs on any exit from the scope
guard file.isValid else { return nil }
return file.read()
}
// several defer blocks run in reverse order
func order() {
defer { print("second") }
defer { print("first") }
}