クロージャーについて少し知識が整理できていなかったので,メモしておきます.
なんとなく使えるけど,一からクロージャーを作るといろいろ疑問がでてきたので自分用にまとめてみました.
後になって考えると最初にこれを知っておけば理解が早かったのにということを忘れないようにメモしました.
▼ クロージャーの文法
1 2 3 | { (引数) -> 返値の型 in 処理 } |
▼ クロージャーを理解するときに知っておくと良いこと
– Swift クロージャーは,引数と返値の型を推論してくれる.
– 引数の()が省略できる.
– 返値を省略できる.
– 返値を暗黙に返してくれる.(クロージャ処理が1行の場合,return も省略できる)
– 引数も略式でかける.($0, $1, $2 というように記述できる)
– 最後の引数がクロージャーの場合,外に配置できる.(()内の引数から外に置ける.Trailing Closures)
– [weak self]
– @escaping
▼ 上記のサンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | // 文法どおりのクロージャー let closureA = {(x: String) -> String in return x + "closureAの処理" } print(closureA("closureA:")) // closureA:closureAの処理 // 暗黙を利用した省略記法のクロージャー let closureB = { x in x + "closureBの処理" } print(closureB("closureB:")) // closureB:closureBの処理 // クロージャーをパラメータに渡す定義 // (第2引数のクロージャーに第1引数の文字を渡す関数) func closureParamA(_ x: String, _ y:(String) -> String) -> String { return y(x) } // 最後のパラメーターにクロージャーを渡す // (既存のクロージャーにパラメータを渡す関数が書ける) let param1 = closureParamA("closureParamA1:", closureA) print(param1) // closureParamA1:closureAの処理 // 最後のパラメーターのクロージャーを()の外に配置する // (新たにクロージャーにパラメータを渡す関数が書ける) let param2 = closureParamA("closureParamA2:") { x in x + "closureParamの処理" } print(param2) // closureParamA2:closureParamの処理 // クロージャー定義をパラメータに書くのが大変なので,typealias を使う typealias closureType = (String) -> String func closureParamB(_ x: String, _ y:closureType) -> String { return y(x) } let param3 = closureParamB("closureParamB:", closureA) print(param3) // closureParamB:closureAの処理 |