# 遅延実行
Swiftで、ある一連の処理が終わったあとに別の処理を実行させたい場合はdefer文を使うことができます。
# defer
defer文は、あるスコープの処理の実行が終わった後に実行されます。
func test() {
defer {
print("defer文が実行されました")
}
print("Hello")
}
test()
// Hello
// defer文が実行されました
# 用途
defer文は最後に必ず実行したい処理などに使われます。
例えば、ファイルにアクセスしたあとにクロージングするときなどです。
func updateFile() {
let file: FileHandle? = FileHandle(forReadingAtPath: filepath)
defer { file?.closeFile() } // 処理の実行後にファイルを閉じる
// 処理を実行
}
また、コールバック関数を必ず実行したいときなども有用です。
func fetchUser(callback: (_ user: User) -> Void) {
var user: User?
// 最後に必ずコールバックが実行される
defer {
guard let user = user else {
fatalError("nil")
}
callback(user)
}
// 処理の実行
}
# 複数のdefer文
複数のdefer文があった場合は、下に定義された順番に実行されます。
func test() {
defer {
print("defer文が実行されました 2番目")
}
defer {
print("defer文が実行されました 1番目")
}
print("Hello")
}
test()
// Hello
// defer文が実行されました 1番目
// defer文が実行されました 2番目
# for-in文の場合
for-in文の中にdefer文を書いた場合は、for-in文の繰り返し文が終わった度に実行されます。
func test() {
for i in 0...5 {
defer {
print("defer文が実行されました")
}
print(i)
}
print("終わりました")
}
test()
// 0
// defer文が実行されました
// 1
// defer文が実行されました
// 2
// defer文が実行されました
// 3
// defer文が実行されました
// 4
// defer文が実行されました
// 5
// defer文が実行されました
// 終わりました