楽水

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

Swift

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

投稿日:


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
-,

執筆者: