クロージャの基本
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 38/56。
クロージャは、プログラム内で受け渡しができ、後で呼び出すことができる自己完結型のコードブロックです。完全な構文では、パラメータと戻り値の型を明記します:
let double = { (n: Int) -> Int in
return n * 2
}
print(double(5)) // 10Swiftは文脈が明確な場合に型を推論できるため、長い形式で記述することはほとんどありません。mapやfilterなどの内部では、より短い簡略記法が一般的です:
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // 最も短く、$0は第1引数ですクロージャは値です。変数に格納したり、関数から返したり、引数として渡したりすることができます。それこそが map が機能する理由のすべてです。
チャレンジ
簡単2行の入力を読み取ります:
- 整数
x - カンマ区切りの整数のリスト
それぞれ (Int) -> Int 型の3つのクロージャを定義します:
addX:引数にxを加算するsquare:引数を2乗した値を返すnegate:引数を符号反転させた値を返す
map を使用して、リストの各要素に各クロージャを適用します。クロージャごとに1行ずつ、計3行を出力し、結果を , で連結します:
addX: ...
square: ...
negate: ...1行目の入力が 10、2行目の入力が 1,2,3 の場合、出力は以下のようになります:
addX: 11,12,13
square: 1,4,9
negate: -1,-2,-3チートシート
クロージャは、保存したり受け渡したりできる、自己完結したコードのブロックです。完全な構文は以下の通りです:
let double = { (n: Int) -> Int in
return n * 2
}クロージャは変数に保存したり、引数として(例えば map などに)渡したりすることができます。Swiftはコンテキストから型を推論するため、簡略化した記述が可能です:
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // $0 は第1引数です自分で試してみよう
let x = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: 3つの (Int) -> Int クロージャを定義し、nums をそれぞれにマップする
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。