実行環境
- Swift4
- Xcode9.3
defer文
スコープを抜ける際に実行したい処理を定義する。
複数のdefer文を記述した場合は逆順で実行される。
単体のdefer文
func deferTest() {
defer {
print("defer文実行")
}
print("Hello, World.")
}
deferTest()
// 【結果】
// Hello, World.
// defer文実行
複数のdefer文
下に宣言したほうが先に実行される。
func deferTest() {
defer {
print("defer文実行_1")
}
defer {
print("defer文実行_2")
}
defer {
print("defer文実行_3")
}
print("Hello, World.")
}
deferTest()
// 【結果】
// Hello, World.
// defer文実行_3
// defer文実行_2
// defer文実行_1
使用例
関数のスコープの場合
func deferTest(param: String) {
defer {
print("defer文実行")
}
if param == "blue" {
print("スコープを抜けます")
return
}
}
deferTest(param: "blue")
// 【結果】
// スコープを抜けます
// defer文実行
関数以外のスコープの場合
繰り返し文
func deferTest() {
let arrayData = ["red", "blue", "yellow", "pink"]
for data in arrayData {
defer {
print("defer文実行")
}
if data == "blue" {
print("スコープを抜けます")
break
}
print(data)
}
}
deferTest()
// 【結果】
// red
// defer文実行
// スコープを抜けます
// defer文実行
注意点
あくまでdeferは処理をスコープが終わるまで待つというものであり、deferが待ち始める前にbreakやreturnなどでスコープを抜けてしまうと実行されない。
func deferTest(param: String) {
if param == "blue" {
print("スコープを抜けます")
return
}
// このdeferは実行されない
defer {
print("defer文実行")
}
}
deferTest(param: "blue")
// 【結果】
// スコープを抜けます