Edited at

Swift 2のdefer文

Swift 2ではdefer文が追加されました。これはGoにあるdefer文とほぼ同じもので、スコープを抜ける際に処理を実行するようにするものです。

func myfunc() {

defer {
// Swift 2からprintlnはなくなり、printになりました
print("deferred")
}
print("Hello, World!")
}

myfunc()

結果は以下のようになり、defer文がmyfunc()の最後に実行されていることがわかります。

Hello, World!

deferred

次に、同じスコープに複数のdefer文を記述してみます。

func myfunc2() {

defer {
print("deferred 1")
}
defer {
print("deferred 2")
}
defer {
print("deferred 3")
}
print("Hello, World!")
}

myfunc2()

結果は以下のようになり、Goと同じようにコード上の記述と逆順で実行されます。

Hello, World!

deferred 3
deferred 2
deferred 1

次に、関数以外のスコープにdefer文を記述してみます。

func myfunc3() {

for i in 0..<3 {
defer {
print("deferred \(i)")
}
print("Hello, \(i)")
}
}

myfunc3()

結果は以下のようになり、関数以外のスコープでもそのスコープを抜ける際にdefer文は実行されます。

Hello, 0

deferred 0
Hello, 1
deferred 1
Hello, 2
deferred 2

Goではリソースのクローズなどを行う際にdefer文が重宝されますが、Swiftでも同様のケースで活用できそうです。