(´・ω・`)お知らせ工事中(´・ω・`)

クロージャ基礎

  • 2021年8月8日
  • Swift
  • 26View
  • 0件
椎名
なんとな〜くで理解して使ってたクロージャ
そのせいで開発中壁に当たった為、改めて理解すべく
クロージャについて一通り調べてみた。

 

クロージャってどういう時に使うのか?

椎名
使いどきを知るべし
内容理解しても使いどきを知らないのは勿体ない・・・

色々な記事を見た感じ主に以下の2パターンが使いどきの模様

  1. コールバック関数を使う時

  2. 非同期制御を行う場合

クロージャを調べ初めの頃は、「別に普通の関数を使えばいいのでは?」と
思っていたのですが上記2点に関しては使うメリットがある。(というか必然的に使わないといけない時もある)

上記2点に関しては別の記事で紹介します。
今回は「クロージャ基礎」なのでそれについて説明したいと思います。
あくまでもクロージャについて導入として書くので細かい省略形などについては
ご自身で調べていただければと存じます。

クロージャとは?

{(hikisuu1: Int, hikisuu2: Int) -> Int in
  let total = hikisuu1 + hikisuu2
  print(total)
  return total
}

こんな感じ・・・
関数名のない関数のようなもの。

使われ方のイメージとしては関数を変数として扱うイメージ。
変数や関数の引数に関数の処理を直接代入するような使い方をする。

個人的押さえておいた方が良い2つのポイント

  1. クロージャを変数として宣言できる

  2. 関数の引数にクロージャを渡せる

椎名
この2つに加えて、上記の使いどきを抑えれば
クロージャはある程度マスターできるはず!!

 

  1. クロージャを変数として宣言できる

宣言方法の例は下記の通り

var test: ((Int, Int) -> String)

上記のように宣言することで、変数testは引数Int型2つ・戻り値Stringのクロージャを代入できる
クロージャ型の変数となる。(クロージャ型と呼んでいいか公式は定かではない・・・)

次に変数testには以下のようにクロージャを代入することができる。

var test:((Int, Int) -> String)

test = {(num1: Int, num2: Int) -> String in
    return String(num1 + num2)
}

print(test(100, 200))
//"300\n"

//変数の宣言と同時にクロージャの中身を書くこともできる
var test = {(num1: Int, num2: Int) -> String in
    return String(num1 + num2)
}

上記のコードは、「渡した数値ふたつを足し合わせ文字列型に変換して返却する」クロージャを
変数testに代入しprint関数で変数testのクロージャを呼び出し標準出力を行なっている処理。

このように、クロージャは変数として扱うことができる。

  1. 関数の引数にクロージャを渡せる

先ほど紹介した通り、クロージャは変数として扱えるため普通の変数同様関数の引数に渡すことができる。

func testFunc(num1:Int, num2:Int, cl:(Int, Int) -> String) {
    print(cl(num1, num2))
}

//①クロージャを宣言してから関数呼び出しの際に引数にセット
var testCl = { (num1:Int, num2:Int) -> String in
    return String(num1 + num2)
}
testFunc(num1: 100, num2: 200, cl: testCl)
//"300\n"

//②関数呼び出しと同時にクロージャを引数にセット
testFunc(num1: 100, num2:200, cl: {(num1:Int, num2:Int) -> String in
    return String(num1 * num2)
})
//"20000\n"

上記のコードは2種類の方法で関数にクロージャを渡している。
コメントで記載した通り、あらかじめクロージャの変数を用意してから引数に渡すか
関数呼び出しと同時にクロージャを引数に書くこともできる。

個人的には後者はあまり可読性が良くないので前者のように分けて宣言した方が良いと思う。

ちなみに上記のコードは
標準出力をする関数「testFunc」を宣言。
その関数に引数2つとクロージャを渡し、渡された引数2つを元に渡されたクロージャを実行する。
ような処理になっている。

関数「testFunc」はあくまでも渡された処理を出力するだけの関数。
渡された引数をごにょごにょして出力ではなくごにょごにょする部分はクロージャで行い
出力は「testFunc」で行う。
この分業スタイルがクロージャを使うメリットの一つではないかと個人的に考えています。

最後に

椎名
いかがだったでしょうか。
少しでもクロージャへの理解の力になれたのであれば嬉しいです。

最初にも記載しましたが、使いどき2パターンについては別の記事にまとめたいと思いますので
そちらも見ていただければと思います。

何かこの記事を見て質問や意見、改善点など見受けられましたら是非ご連絡ください。
最後まで見てくださりありがとうございます。

Swiftの最新記事4件