筆者がいろんな言語を使用してきて、他の言語と異なる気になると感じたSwiftで押さえておきたい構文を「なにが出来るの?」といった視点で紹介していきます。

今回は前回のクロージャの続き、トレーリングクロージャについて公式サイトの説明を使用しながら解りやすく解説していきます。

 

 

トレーリングクロージャ(Trailing Closures)?

関数の引数の最後がクロージャ式の場合、クロージャを()の後に記述することができます。これをトレーリングクロージャ(Trailing Closures)または、末尾クロージャといいます。

関数の引数としてクロージャー式があり、クロージャー式が長い場合はトレーリングクロージャとして記述すると便利。

関数使用を決定する際にクロージャー式はできるだけ引数の最後配置することでトレーディングクロージャとして使用できなるため使用の幅が広がります。

 

func closureExample(closure:{(a: Int) -> Int in
  // 関数本体
})
引数はクロージャのみの場合

 

↑の関数をトレーリングクロージャを使用して呼び出す方法は次の通り。

 

トレーリングクロージャを使用して関数closureExampleをコールする場合の記述
closureExample() { (a: Int) -> in
  クロージャ処理
  return Int
}

  

ポイント!
  • 引数を記述する()内には書かず、()に続けて{}でクロージャーを定義
  •   

    ソートクロージャをトレーリングクロージャとして記述した場合以下のようになります。

    let fruit = ["Orange","Banana","Melo"n,"Grapes","Pear","Peaches"]
    sortFruit = fruit.sorted() { $0 > $1 }

      

    引数がクロージャ式だけの場合メソッドコール時の()は省略可能

    クロージャー式が関数またはメソッドの唯一の引数として提供され、その式を末尾のクロージャーとして使用する場合、関数または、メソッドを呼び出すときの()は省略できます。

     

    sorted(by:)メソッドで記述した場合は以下のような記述となります。

    sortFruit = fruit.sorted{$0 > $1}

      

    トレーリングクロージャの引数ラベルが省略できるケース

    関数の引数に複数のクロージャーがある場合、最初のトレーリングクロージャーの引数ラベルを省略し、残りのトレーリングクロージャにラベルを付けます。

     

    例 次の関数は画像を読込みます

    func loadSound(center: URL?, filename: String?, completion: (location) -> Void, onFailure:() -> Void) {
      if let location = fileDownload(filename:String?, from: center) {
        completion(location)
      }
      else {
    		onFailure()
    	}
    }

     

    この関数を呼び出してファイルを読込むときは、2つのクロージャを提供します。最初のクロージャはダウンロードが成功した後に画像を表示する完了ハンドラーです。
    2番目のクロージャはユーザーにエラーを表示するエラーハンドラーです。

    上の例ではタスク終了状態により2つのクロージャのいずれかをコールします。

    ファイルダウンロードが成功した場合、ユーザーインターフェースを更新するコードをCompletionとして記述、失敗した場合のコードをonFailureとして記述することでコード明確にすることができます。

     

    これを、トレーリングクロージャとして記述すると下記の通りとなります。

    loadSound(center: URL?, filename: String?) { location in
      print(location.absoluteString)
    } onFailure: {
    	print("Couldn't download the file.")
    }

     

     

    クロージャの値キャプチャ

    クロージャは、定義されている周囲のコンテキストから定数と変数をキャプチャできます。

    要するにクロージャーはある関数の引数として渡し、その関数内で無名関数として処理する場合において、

    定義した処理前後の定数、変数を参照して処理することができます。

    例)クラスAで使用しているメンバや、変数をクラスBでクロージャーを処理する際に参照して処理することが可能

    イメージ)

    エスケープクロージャ(Escaping Closures)

    関数の引数として入力されたクロージャが、関数本文が終了した後に呼び出される場合、関数をエスケープすると呼ばれ。クロージャーを受け取る関数を宣言する場合にパラメータの型の前に@escapingを記述して、クロージャがエスケープすることを明示します。

    使用例としては非同期処理出のクロージャを使用する場合などです。

    クロージャの紹介は以上になります。

     

    参考文献:Swift公式

     

    最後に

    最後までお読みいただきありがとうございました。

    今後も気になる構文を紹介していきたいと思います。ご意見等ありましたらメッセージただけますと幸いです。

    以下の記事にてClosure解説の前半部分を紹介していますのでよかったら参照してみてください。

    Swift 押さえておきたい構文 「Closure」で”できる事”①

        筆者がいろんな言語を使用してきて、他の言語と異なる気になると感じたSwiftで押さえておきたい構文を「なにが出来るの?」といった視点で紹介していきます。 今回…