0
1

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 1 year has passed since last update.

関数の引数に関数を指定する(クロージャ)

Last updated at Posted at 2022-04-25

はじめに

最近まで「関数の引数に関数を指定する」のやり方がわからなかったのですがちょっと理解したので今後、見返せるようにまとめておきます

クロージャについて

公式のクロージャのサンプルです

let sum = { (x: Int, y: Int) -> Void in
    print(x + y)
}

sum(7, 8) // OK
sum(x: 7, y: 8) // エラー

これはクロージャ定数というものです
クロージャ定数を使ってみて不思議だったのが使用時に引数名を記述してはいけないという点です。
関数と同じ様な使い方なので今までの自分では関数との区別ができていなかったです。

また、デフォルト値の指定ができない様です

// ❌
let sum = { (x: Int = 0, y: Int = 1) -> Void in
    print(x + y)
}

関数の引数に関数を指定

これが今回のメインです
これは「関数の引数にクロージャを使う」というみたいです

struct ContentView: View {
    var body: some View {
        Button(action: {
            // 使い方
            sum(x: 2, y: {
                average(x: 3, y: 4, z: 2)
            })
        }) {
            Text("実行")
        }
    }
    // ここがクロージャ
    func sum(x: Int, y: () -> Int) { // 引数に () -> 型名 を指定する
        print(x + y())
    }
    // 引数として使う関数
    func average(x: Int, y: Int, z: Int) -> Int {
        return (x + y + z) / 3
    }
}

トレイリングクロージャという書き方もあるみたいです
トレイリングクロージャを使うと解読性が上がりそうです

// デフォルト
sum(x: 2, y: {
    average(x: 3, y: 4, z: 2)
})

// トレイリングクロージャ
sum(x: 2) {
    average(x: 3, y: 4, z: 2)
}

ちょっと簡単になりましたね

もしかしたらこれもトレイリングクロージャかも?

// デフォルト
Button(action: {

}, label: {
    
})

// actionにトレイリングクロージャ
Button {
    
} label: {

}

// labelにトレイリングクロージャ
Button(action: {

}) {

}

// actionとlabelにトレイリングクロージャ
Button("") {

}

そんな気がします

おわり

ちょっとずつ知識が増えている事が実感できると楽しくなりますよね
クロージャについて知識が増えたらここに追加していきます。

間違っているところがあればコメントで教えてください!!

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?