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
の使いすぎに注意。 訳わからんようなるので
いままで読んだ中でクロージャのところがいちばん面白かった。