すべての関数には、関数のパラメータの型と戻り値の型で構成される特定の関数型があります。
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.