Edited at

【Swift】defer文

More than 1 year has passed since last update.


実行環境


  • 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")

// 【結果】
// スコープを抜けます