Closures

lambda を「らんびだ」と呼んでいた人を思い出す。

前回に引き続いて https://docs.swift.org/swift-book/LanguageGuide/Closures.html を読んでいる。

気になった事

  • グローバル関数とネストされた関数はクロージャの特別なやつ
  • 一般的な形式 reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )
  • 型推論できる型は省略できる reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
  • クロージャの本体が式一個のときは return を省略できる reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
  • 引数リストを簡略表記にして in も省略できる reversedNames = names.sorted(by: { $0 > $1 } )
  • 演算子メソッドを使う場合 reversedNames = names.sorted(by: >)
  • 関数の最後のパラメータにクロージャを渡す場合は括弧()の外側にぶら下げられる reversedNames = names.sorted() { $0 > $1 }
  • クロージャが唯一のパラメータなら括弧()も省略できる reversedNames = names.sorted { $0 > $1 }
  • 値のキャプチャーは他のプログラム言語のラムダ式なんかと同じ
  • 渡したクロージャが何処かに登録されて後で使われるような場合 @escaping を「パラメータ名:」と「型名」の間に書く func addEventListener(l: @escaping () -> Void) {〜} この場合 @escaping を付けないとコンパイルエラー
  • 関数に式を渡すとき自動的にクロージャにしてくれる @autoclosure を「パラメータ名:」と「型名」の間に書く func log(_ message: @autoclosure () -> String) {〜}
  • @autoclosure は遅延評価に便利
  • @autoclosure の使いすぎに注意。 訳わからんようなるので

いままで読んだ中でクロージャのところがいちばん面白かった。