Swift の defer 文
ここでは Swift の defer 文 についてご説明します。
Swift の defer 文の基本
Swift の defer 文を使うと、スコープを抜ける時に、指定したステートメントを実行することができます。
どんな状態でスコープを抜けても実行されるので、スコープ内で予期せぬエラーが起きた時の後処理にも使えます。
Swift の defer 文の構文は次の通りです。
defer {
[ステートメント]
}
次の defer 文を実行してみます。
func testFunction1() {
print("Statement 1")
defer {
print("Defer 1")
}
print("Statement 2")
}
testFunction1()
実行結果は次のようになります。
Statement 1
Statement 2
Defer 1
print 文が Statement 1 -> Statement 2 -> Defer 1 の順番で実行されています。
defer 文内の変数について
defer 文内で使用されている変数の値などは、defer 文が実行される時点のものになります。
value という名前の変数に値を代入して defer 文内のステートメントで print してみます。
func testFunction2() {
var value = 1
print("Statement 1 - value: \(value)")
defer {
print("Defer 1 - value: \(value)")
}
value = 2
print("Statement 2 - value: \(value)")
}
testFunction2()
実行結果は次のようになります。
Statement 1 - value: 1
Statement 2 - value: 2
Defer 1 - value: 2
Defer 1 に続く value の値が 1 ではなく、2 になっていることがわかります。
複数の defer 文があるケース
defer 文が複数ある時は、先に定義されたものが後になるように反対の順番で実行されます。
func testFunction3() {
print("Statement 1")
defer {
print("Defer 1")
}
defer {
print("Defer 2")
}
defer {
print("Defer 3")
}
print("Statement 2")
}
testFunction3()
実行結果は次のようになります。
Statement 1
Statement 2
Defer 3
Defer 2
Defer 1
Defer 文が 3 -> 2 -> 1 の順番で実行されていますね。
do 文と合わせて defer 文を使う
do 文と合わせて使うことでスコープを作って、do 文のスコープを抜ける時に defer 文を実行することもできます。
func testFunction4() {
print("Statement 1")
do {
print("Statement 2")
defer {
print("Defer 1")
}
print("Statement 3")
}
print("Statement 4")
}
testFunction4()
実行結果は次のようになります。
Statement 1
Statement 2
Statement 3
Defer 1
Statement 4
Statement 1 の print 文が実行され、do 文内 print 文が Statement 2 -> Statement 3 -> Defer 1 の順番で実行されて、その後、外のスコープの Statement 4 の print 文が実行されています。
以上、Swift の defer 文 についてご説明しました。