Swift のすべての関数には型があり、関数のパラメータの型と戻り値の型で構成されます。
この型を Swift の他の型と同じように使うことができ、他の関数にパラメータとして関数を渡すことや、関数から関数を返すことができます。
今回、Swiftの関数型について以下の観点で丁寧に解説します。
- 関数型について
- 関数型の使用
- パラメータの型としての関数型
- 戻り値の型としての関数型
なお、関数に関しては、
Swiftの関数
Swiftの関数のパラメータ
Swiftの関数のネスト
を参照してください。
参考本
[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 WEB+DB PRESS plus
関数型について
すべての関数には、関数のパラメータの型と戻り値の型で構成される特定の関数型があります。
return a + b
}
func multiplyTwoInts(a: Int, _ b: Int) -> Int {
return a * b
}
両関数の型は (Int, Int) -> Int です。
これを
「関数型に 2 つのパラメータがあり、両方ともInt型で、関数は Int 型の値を返します。」
のように読むことができます。
関数型の使用
Swift の他の型と同じように関数の型を使用します。
例として、関数型の定数または変数を定義し、適切な関数をその変数に代入することができます。
これを
「Int 値を 2 つ受け取り、Int 値を返す関数型の変数 mathFunction を定義する。この新しい変数が関数 addTwoInts を参照するよう設定する。」
のように読むことができます。
そして、代入された関数を名前 mathFunction で呼び出すことができます。
// “Result: 5” と出力
また、型が一致する別の関数をこの同じ変数に代入することができます。
print(“Result: \(mathFunction(2, 3))”)
// “Result: 6” と出力
また、関数は定数または変数に代入することができ、そのとき、Swift に関数型を推論させることができます。
// anotherMathFunction は (Int, Int) -> Int 型と推論
パラメータの型としての関数型
別の関数のパラメータの型として、(Int, Int) -> Int のような関数型を使用することができます。
関数を呼び出すときに、関数の呼び出し元で関数の実装を渡すことができます。
print(“Result: \(mathFunction(a, b))”)
}
この例では、パラメータが 3 つの関数 printMathResult(_:_:_:) を定義しています。
1 つ目のパラメータは mathFunction で、型は (Int, Int) -> Int です。
このパラメータに、その型の関数を引数として渡すことができます。
2 つ目と 3 つ目のパラメータは a と b で、共に Int 型です。これらは関数の入力値として使用されます。
// “Result: 8” と出力
printMathResult(_:_:_:) が呼び出されるときに、関数 addTwoInts(_:_:) と整数値 3 と 5 が渡されています。
渡された関数を値 3 と 5 で呼び出し、結果 8 を出力しています。
なお、printMathResult(_:_:_:) の役割は、適切な型の関数を呼び出した結果を出力することです。
関数の実装が実際に処理することは問題ではなく、関数が正しい型であることが重要です。
これにより、型が安全な方法で、printMathResult(_:_:_:) が関数の呼び出し元に対して、その機能性を渡すことができるようになっています。
戻り値の型としての関数型
別の関数の戻り値の型として、関数型を使用することができます。
関数が返す型として、リターンアロー (->) に続けて完全な関数型を記述します。
次の関数 chooseStepFunction(_:) の戻り値の型は、関数型 (Int) -> Int です。
関数 chooseStepFunction(_:) は、ブールのパラメータ backwards によって関数 stepForward(_:) または関数 stepBackward(_:) を返します。
return backwards ? stepBackward : stepForward
}
一方向に進む関数か、逆方向に戻る関数を取得するために chooseStepFunction(_:) を使用することができます。
let moveNearerToZero = chooseStepFunction(currentValue > 0)
// moveNearerToZero は関数 stepBackward() を参照
今回は、Swiftの関数型について解説しました。