31
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Swift】defer文

Last updated at Posted at 2018-04-21

実行環境

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?