Menu
Coddy logo textTech

クロージャの基本

CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 38/56。

クロージャは、プログラム内で受け渡しができ、後で呼び出すことができる自己完結型のコードブロックです。完全な構文では、パラメータと戻り値の型を明記します:

let double = { (n: Int) -> Int in
    return n * 2
}
print(double(5))                  // 10

Swiftは文脈が明確な場合に型を推論できるため、長い形式で記述することはほとんどありません。mapfilterなどの内部では、より短い簡略記法が一般的です:

let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 }    // 最も短く、$0は第1引数です

クロージャは値です。変数に格納したり、関数から返したり、引数として渡したりすることができます。それこそが map が機能する理由のすべてです。

challenge icon

チャレンジ

簡単

2行の入力を読み取ります:

  1. 整数 x
  2. カンマ区切りの整数のリスト

それぞれ (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 をそれぞれにマップする
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン