こちらもguardと一緒でSwift2.0から使える新しめのもの。
deferはスコープを抜け出す際に、実行される処理を定義できるよ。
Swiftでdeferを使う
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var tmp = "" for i in 0...2 { defer { print("\(tmp)です") } guard i <= 1 else { tmp = String(i) continue } tmp = String(i) } // 0です // 1です // 2です |
こんな感じでtmpにnumの文字列が格納されたあとに、それぞれdeferが動いてprintが動作してるよ。
注意点があって、deferの宣言する位置で処理が異なるので補足するよ。
Swiftでdeferの処理のタイミング
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var tmp: String for i in 0...2 { guard i <= 1 else { tmp = String(i) continue } tmp = String(i) defer { print("\(tmp)です") } } // 0です // 1です |
上と見比べたらわかるように、deferを下に移動しただけだよ。
でも上と出力結果が異なってるのがわかると思う。
deferというのはあくまで、処理をスコープが終わるまで待つという処理なので、deferが待ち始める前にbreakやreturnなどでスコープを抜けてしまうと実行されないよ。
(今回はiが2のときにスキップされて、スコープから抜けてるよ)
おまけ: deferを複数定義する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
var tmp = "" for i in 0...2 { defer { print("\(tmp)おすし") } defer { tmp = "\(tmp)ですし" } guard i <= 1 else { tmp = String(i) continue } tmp = String(i) } // 0ですしおすし // 1ですしおすし // 2ですしおすし |
このように複数deferを定義しても問題なく動くよ。
出力結果を見たらわかるように、下に宣言したほうが先に動くよ。
deferはguardと組み合わせて、必須条件を満たしていない場合の処理をdeferに記述するといったナウい感じで使えるよ。