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

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

この例では、シンプルな数学の関数 addTwoInts と multiplyTwoInts を定義しています。各関数は Int 値を 2 つ受け取り、計算を実行した結果の Int 値を返します。

両関数の型は (Int, Int) -> Int です。これを次のように読むことができます。

「関数型に 2 つのパラメータがあり、両方とも Int 型で、関数は Int 型の値を返します。」

次は別の例で、パラメータも戻り値も無い関数です。

func printHelloWorld() {
    print("hello, world")
}

この関数型は () -> Void で、「関数にパラメータが無く、Void を返します。」

関数型を使用

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

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

これを次のように読むことができます。

Int 値を 2 つ受け取り、Int 値を返す関数型の変数 mathFunction を定義する。この新しい変数が関数 addTwoInts を参照するよう設定する。」

関数 addTwoInts(_:_:) は変数 mathFunction と同じ型であるため、Swift の型チェッカーはこの代入を認めます。

そして、代入された関数を名前 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))")
}
printMathResult(addTwoInts, 3, 5)
// "Result: 8" と出力

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

printMathResult(_:_:_:) が呼び出されるときに、関数 addTwoInts(_:_:) と整数値 3 と 5 が渡されています。渡された関数を値 3 と 5 で呼び出し、結果 8 を出力しています。

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

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

別の関数の戻り値の型として、関数型を使用することができます。関数が返す型として、リターンアロー (->) に続けて完全な関数型を記述します。

次の例では、シンプルな関数 stepForward(_:) と stepBackward(_:) を定義しています。関数 stepForward(_:) は入力値より 1 多い値を返し、関数 stepBackward(_:) は入力値より 1 少ない値を返します。関数の型は共に (Int) -> Int です。

func stepForward(input: Int) -> Int {
    return input + 1
}
func stepBackward(input: Int) -> Int {
    return input - 1
}

次の関数 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() を参照

この例では、次第にゼロに近づくように、ステップが正か負かを変数 currentValue で確認しています。currentValue は初期値が 3 で、currentValue > 0 は true を返し、chooseStepFunction(_:) は関数 stepBackward(_:) を返します。返された関数の参照は、定数 moveNearerToZero で保持しています。

moveNearerToZero は、ゼロまでカウントするために使用できる正しい関数を参照しています。

print("Counting to zero:")
// ゼロまでカウント
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// 3...
// 2...
// 1...
// zero!

Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.