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でも同様のケースで活用できそうです。