【Swift】deferステートメントの使い方!スコープを抜ける際に処理を実行
この記事からわかること
- Swiftのdeferステートメントの使い方
- スコープを抜ける際に処理を実行する方法
- 定義のタイミングや変数の参照
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- iOS:17.1
- Swift:5.9
- macOS:Sonoma 14.1
deferステートメントとは?
Swiftの構文の1つであるdefer
ステートメントはスコープを抜ける際に実行されるコードブロックを定義できる構文です。
defer {
// スコープを抜けた際に実行したい処理
}
スコープとはコード内の特定の部分で変数や定数がアクセス可能な範囲を指します。スコープ内の変数や定数は、そのスコープ内でのみ有効であり、外部からアクセスすることはできません。例えば関数はその処理が終了するとスコープが閉じられるのでその関数内で定義した変数などはその中でしか使用することはできません。
defer
の挙動を確かめるために以下の関数を実行してみます。
func debugPrint() {
print("1")
defer {
print("end")
}
print("2")
print("3")
}
debugPrint()
出力されるのは以下の通りになります。
1
2
3
end
また複数のdeferを定義することもでき、その実行タイミングは定義した順番とは逆になります。
func debugPrint() {
print("1")
defer {
print("end")
}
print("2")
defer {
print("end2")
}
print("3")
}
1
2
3
end2
end
deferの定義タイミング
defer
をスコープ内に定義する場所はエラーの発生やreturn、breakなどスコープが終了する箇所の後に設置した場合は動作しません。
do {
defer { print("処理1") }
try conversionNum(numStr: "11")
defer { print("処理2") }
} catch {
print("エラー発生")
}
エラーなし:処理2→処理1
エラー発生:処理1
変数の参照
defer
内ではスコープの変数を参照することができますが、その値はスコープを抜けた時に保持している値になります。
func debugPrint() {
var value = 1
print("Start:\(value)")
defer {
print("defer: \(value)")
}
value = 2
print("End:\(value)")
}
Start:1
End:2
defer: 2
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。