楽水

人々の創造が自由に表現できる舞台づくり

Swift

Swiftの関数型についてわかりやすく解説

投稿日:2020年8月24日 更新日:


Swift のすべての関数には型があり、関数のパラメータの型と戻り値の型で構成されます。
この型を Swift の他の型と同じように使うことができ、他の関数にパラメータとして関数を渡すことや、関数から関数を返すことができます。
今回、Swiftの関数型について以下の観点で丁寧に解説します。

  • 関数型について
  • 関数型の使用
  • パラメータの型としての関数型
  • 戻り値の型としての関数型

なお、関数に関しては、
Swiftの関数
Swiftの関数のパラメータ
Swiftの関数のネスト
を参照してください。
参考本
[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 WEB+DB PRESS plus

関数型について

すべての関数には、関数のパラメータの型と戻り値の型で構成される特定の関数型があります。

func addTwoInts(a: Int, _ b: Int) -> Int {
 return a + b
}
func multiplyTwoInts(a: Int, _ b: Int) -> Int {
 return a * b
}

両関数の型は (Int, Int) -> Int です。
これを
「関数型に 2 つのパラメータがあり、両方ともInt型で、関数は Int 型の値を返します。」
のように読むことができます。

関数型の使用

Swift の他の型と同じように関数の型を使用します。
例として、関数型の定数または変数を定義し、適切な関数をその変数に代入することができます。

var mathFunction: (Int, Int) -> Int = addTwoInts

これを
「Int 値を 2 つ受け取り、Int 値を返す関数型の変数 mathFunction を定義する。この新しい変数が関数 addTwoInts を参照するよう設定する。」
のように読むことができます。
そして、代入された関数を名前 mathFunction で呼び出すことができます。

print(“Result: \(mathFunction(2, 3))”)
// “Result: 5” と出力

また、型が一致する別の関数をこの同じ変数に代入することができます。

mathFunction = multiplyTwoInts
print(“Result: \(mathFunction(2, 3))”)
// “Result: 6” と出力

また、関数は定数または変数に代入することができ、そのとき、Swift に関数型を推論させることができます。

let anotherMathFunction = addTwoInts
// anotherMathFunction は (Int, Int) -> Int 型と推論

パラメータの型としての関数型

別の関数のパラメータの型として、(Int, Int) -> Int のような関数型を使用することができます。
関数を呼び出すときに、関数の呼び出し元で関数の実装を渡すことができます。

func printMathResult(mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
 print(“Result: \(mathFunction(a, b))”)
}

この例では、パラメータが 3 つの関数 printMathResult(_:_:_:) を定義しています。
1 つ目のパラメータは mathFunction で、型は (Int, Int) -> Int です。
このパラメータに、その型の関数を引数として渡すことができます。
2 つ目と 3 つ目のパラメータは a と b で、共に Int 型です。これらは関数の入力値として使用されます。

printMathResult(addTwoInts, 3, 5)
// “Result: 8” と出力

printMathResult(_:_:_:) が呼び出されるときに、関数 addTwoInts(_:_:) と整数値 3 と 5 が渡されています。
渡された関数を値 3 と 5 で呼び出し、結果 8 を出力しています。
なお、printMathResult(_:_:_:) の役割は、適切な型の関数を呼び出した結果を出力することです。
関数の実装が実際に処理することは問題ではなく、関数が正しい型であることが重要です
これにより、型が安全な方法で、printMathResult(_:_:_:) が関数の呼び出し元に対して、その機能性を渡すことができるようになっています

戻り値の型としての関数型

別の関数の戻り値の型として、関数型を使用することができます。
関数が返す型として、リターンアロー (->) に続けて完全な関数型を記述します。
次の関数 chooseStepFunction(_:) の戻り値の型は、関数型 (Int) -> Int です。
関数 chooseStepFunction(_:) は、ブールのパラメータ backwards によって関数 stepForward(_:) または関数 stepBackward(_:) を返します。

func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
 return backwards ? stepBackward : stepForward
}

一方向に進む関数か、逆方向に戻る関数を取得するために chooseStepFunction(_:) を使用することができます。

var currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0)
// moveNearerToZero は関数 stepBackward() を参照

今回は、Swiftの関数型について解説しました。

-Swift
-,

執筆者:

関連記事

Swiftの関数のネストについてわかりやすく解説

Swiftでは、関数のスコープ内に便利な機能を包むために、他の関数の中に関数を記述することができます。 ネストされた関数を別のスコープで使用できるように、ネストしている関数からネストされた関数を返すこ …

Swiftのクロージャのエスケープ【escapingについてわかりやすく解説】

Swiftを学ぶ過程でescapingというキーワードに出会うことがあると思います。 今回は、クロージャのescapingについて以下の観点で丁寧も解説します。 Swiftのクロージャのescapin …

Swiftクロージャによる強い参照の循環参照とその解決

Swiftのメモリ管理 では、 2 つのクラスインスタンスのプロパティが互いに強い参照を持つことで、どのようにして強い参照の循環参照が生成されるのかを見てきました。 また、強い参照の循環参照を切るため …

Swiftの関数のパラメータ【引数ラベルなどについてわかりやすく解説】

Swift 関数には、パラメータ名の無いシンプルな関数から、引数ラベルや各種パラメータがあるメソッドまで表現できる柔軟性があります。 パラメータは、関数の呼び出しを簡略化するためのデフォルト値を持つこ …

Swiftのデイニシャリゼーションについてわかりやすく解説

Swiftでは、インスタンスが必要でなくなったとき、リソースを解放するために、自動参照カウント (ARC) という方法でインスタンスの割り当てを解除します。 インスタンスの割り当て解除が行わ …