【Swift】クロージャーの使い方


<h2 class="wp-block-heading"><span id="toc1">クロージャーとは</span></h2>



<p>クロージャーは、関数を変数のように扱うことができる機能であり、関数を引数として渡すことや、関数から戻り値として返すことができます。</p>



<h2 class="wp-block-heading"><span id="toc2">例文</span></h2>



<h3 class="wp-block-heading"><span id="toc3">クロージャーの基本的な構文</span></h3>



<p>クロージャーの基本的な構文は以下のようになります。</p>



<pre class="wp-block-preformatted hljs rust"><code>{ (引数) -&gt; 戻り値の型 <span class="hljs-keyword">in</span>
  <span class="hljs-comment">// 処理内容</span>
}</code></pre>



<p>例えば、以下は、引数に整数を取り、2倍した値を返すクロージャーの例です。</p>



<pre class="wp-block-preformatted hljs kotlin"><code>let doubler = { (number: <span class="hljs-built_in">Int</span>) -&gt; <span class="hljs-built_in">Int</span> <span class="hljs-keyword">in</span>
  <span class="hljs-keyword">return</span> number * <span class="hljs-number">2</span>
}</code></pre>



<h3 class="wp-block-heading"><span id="toc4">クロージャーの使用例</span></h3>



<p>クロージャーを使用する例として、以下は、配列に対してクロージャーを使い、要素を2倍した配列を作成する例です。</p>



<pre class="wp-block-preformatted hljs yaml"><code><span class="hljs-string">let</span> <span class="hljs-string">numbers</span> <span class="hljs-string">=</span> <span class="hljs-string">[1,</span> <span class="hljs-number">2</span><span class="hljs-string">,</span> <span class="hljs-number">3</span><span class="hljs-string">,</span> <span class="hljs-number">4</span><span class="hljs-string">,</span> <span class="hljs-number">5</span><span class="hljs-string">]</span>
<span class="hljs-string">let</span> <span class="hljs-string">doubledNumbers</span> <span class="hljs-string">=</span> <span class="hljs-string">numbers.map({</span> <span class="hljs-string">(number:</span> <span class="hljs-string">Int)</span> <span class="hljs-string">-&gt;</span> <span class="hljs-string">Int</span> <span class="hljs-string">in</span>
  <span class="hljs-string">return</span> <span class="hljs-string">number</span> <span class="hljs-string">*</span> <span class="hljs-number">2</span>
<span class="hljs-string">})</span>
<span class="hljs-string">print(doubledNumbers)</span> <span class="hljs-string">//</span> <span class="hljs-string">[2,</span> <span class="hljs-number">4</span><span class="hljs-string">,</span> <span class="hljs-number">6</span><span class="hljs-string">,</span> <span class="hljs-number">8</span><span class="hljs-string">,</span> <span class="hljs-number">10</span><span class="hljs-string">]</span></code></pre>



<p>また、クロージャーを引数として渡す例として、以下は、引数としてクロージャーを受け取り、そのクロージャーを2回実行する関数を定義する例です。</p>



<pre class="wp-block-preformatted hljs swift"><code><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">runTwice</span><span class="hljs-params">(<span class="hljs-number">_</span> closure: <span class="hljs-params">()</span></span></span> -&gt; ()) {
  closure()
  closure()
}

runTwice {
  <span class="hljs-built_in">print</span>(<span class="hljs-string">"Hello"</span>)
}
<span class="hljs-comment">// Hello</span>
<span class="hljs-comment">// Hello</span></code></pre>



<h3 class="wp-block-heading"><span id="toc5">キャプチャーとエスケープ</span></h3>



<p>クロージャーは、変数を「キャプチャー」することができます。キャプチャーとは、クロージャーが作成された時点で存在していた変数を、そのクロージャー内で利用できるようにすることです。また、クロージャーを関数の引数として渡す場合、そのクロージャーが関数の実行が終了した後も実行される可能性がある場合、「エスケープ」する必要があります。</p>



<pre class="wp-block-preformatted hljs swift"><code><span class="hljs-keyword">var</span> x = <span class="hljs-number">10</span>
<span class="hljs-keyword">let</span> closure = {
  <span class="hljs-built_in">print</span>(x)
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">foo</span><span class="hljs-params">(closure: <span class="hljs-params">()</span></span></span> -&gt; ()) {
  closure()
}
foo(closure: closure) <span class="hljs-comment">// 10</span>
</code></pre>



<p>この例では、クロージャーが変数xをキャプチャーしており、関数fooでエスケープしています。そのため、関数fooの実行が終了した後も、クロージャーが実行される可能性があることに注意してください。</p>
      </div>

## 最後に
iOSアプリ開発をしています。
主にSwiftですが、最近は熱が入ってきてFlutterも🦾
色々やってます。もし良かったら見てってください。

https://sogablog.net/