# 遅延実行

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文が実行されました
// 終わりました