【Swiftのお勉強】クロージャ(Closure)の使い方 – SwiftUIアプリ開発基礎

クロージャの使い方のトップ画像 SwiftUI

クロージャは、”関数閉包“と呼ばれる特殊な関数です。

普通の関数と似ていますが、一般的な関数のように名前をつける必要が無く

指定した変数引数

関数で行っている処理直接代入します。

サンプルコードなどを参照するとかなりの割合で使われています。

使い方を覚えることで、開発の柔軟性が上がると思いますので

しっかりと使い方を身につけましょう。

ここでは以下のことを学習します。
・クロージャの定義について
・クロージャの基本的な使い方について
・クロージャを返す関数の使い方について
合わせて読んで欲しい記事一覧です。

1.【Swiftのお勉強】クロージャの定義について

クロージャの定義の仕方は以下になります。

{([引数]) -> [戻り値の型] in
  [処理]
}

省略できる場合もありますが

「引数」、「戻り値の型」、「処理」

の三つを指定する必要があります。

書き方が異なるだけで一般的な関数と基本的には変わりません。

特殊なだけで、クロージャも関数の一種であるということを頭に置いて

使い方を確認していきましょう。

2.【Swiftのお勉強】クロージャの使用方法

クロージャは用途によって、定義を省略することが出来ます。

省略系で書かれているクロージャ文も多いので

省略系も一緒に覚えてしまいましょう。

1. 引数と戻り値が定義されているクロージャ

省略されずに書かれているクロージャの例です。

(n:Int) -> 「処理」で使用される引数の名前:引数の型

Int -> 戻り値の型

n/2 -> 処理の内容

となっており、このような短い文の場合

returnは省略出来ます。

var closure = {(n:Int) -> Int in
        return n/2
}
closure(100) //50

こちらでも可能。

1文しかないので、”n/2″が戻り値になることが自明だからです。

var closure = {(n:Int) -> Int in
       n/2
}

2. 戻り値の型を定義しないクロージャの使い方

シンプルな形でのクロージャの使い方です。
引数の型“と”戻り値の型“は省略されており、「引数の定義」と「処理」のみが書かれています。
このように短い処理の場合は、戻り値の型を定義する必要がありません。

//省略クロージャ文
var closure1 = {n in
    n*2
}
//呼び出し
closure1(100)  //200

3. 省略出来ないクロージャの場合

省略出来る短い処理ばかり取り上げましたが

処理が長い場合は省略出来ません。

処理が長くなってくると

Swiftのコンパイラが

どこでreturnを返すべきか、分からなくなってしまいます。

プレイグラウンドを使用している人は

“return”を削除してみると良いでしょう。

以下のようなエラーが出力されるかと思います。

error: missing return in a closure expected to return ‘Int’
処理が長い場合は、省略せずに定義をしっかり書きましょう。
var closure2 = {(n:Int) -> Int in
    var result = 0
    result = n*100
    return result
}
closure2(100) //10000

3.【Swiftのお勉強】クロージャを返す関数について

関数の処理を直接変数に閉じ込める処理ばかり紹介してきました。

クロージャの一番の利点は

クロージャを返す関数を使用出来る点にあります。

結構、難しいですね

関数が”関数を返り値に持つ“のです。

1. クロージャを返す関数の定義

func [関数の名前] -> ([引数の型1]) -> [返り値の型1]{
        [処理1]
        return { ([引数: 引数の型]) -> [返り値の型] in
                [処理2]
        }
}

このように、関数自体が返り値を持つような式を作ることが出来ます。

少しだけ処理内容を紐解いてみます。

・([引数の型1]) -> [返り値の型1]

クロージャを返り値に持つ関数ですよと言う意味です

変数や定数にこの関数を代入すると

ここで定義されている型を持った

クロージャが変数や定数に代入されます。

return { ([引数: 引数の型]) -> [返り値の型] in
                [処理2]
        }

返されるクロージャの処理内容を表しています。

変数や定数には、上記の処理が含まれるクロージャが代入されます。

具体的な使い方は次の章で見ていきます。

2. クロージャを返す関数の使用方法

実際に使用している例をみてみましょう

//クロージャを返す関数
func clfunc() -> (Int)-> Int{
    var result3 = 0
    return {(value:Int)->Int in
        result3 = value*10
        return result3
    }
}

//クロージャを定数に代入
let result_func = clfunc()

//Int型の数字を引数にいれて、クロージャの処理を実施
result_func(100) //1000

Swiftのチュートリアルやライブラリで

このように複雑な関数の定義の仕方をしていることもあります。

アプリ開発の理解を深めるためにも

このような方法があると言うことを覚えておきましょう。

4.【Swiftのお勉強】まとめ

今回はクロージャの基本的な使い方クロージャを返す関数について紹介しました。

クロージャを返す関数は、一回見ただけだと頭が混乱するかと思います。

初めて見たという方は、Xcodeのプレイグラウンドを使って勉強してみることをオススメします。

複雑ですが、何回か自分で書いているうちに分かるようになるかと思います。

 

┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘

IT・Web・ゲーム業界のエンジニア転職なら【Tech Stars Agent】

https://px.a8.net/svt/ejp?a8mat=3H5G2S+AM8B5E+3TVC+TSBEB
┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘

0

コメント

タイトルとURLをコピーしました