関数のパラメータには、外部パラメータ名とローカルパラメータ名があります。外部パラメータ名は、関数呼び出し時の引数に使用します。ローカルパラメータ名は、関数の実装で使用します。

func someFunction(firstParameterName: Int, secondParameterName: Int) {
    // 1 つ目と 2 つ目のパラメータの引数値を
    // firstParameterName と secondParameterName で参照
}
someFunction(1, secondParameterName: 2)

デフォルトでは、1 つ目のパラメータは外部名を省略し、2 つ目以降のパラメータは外部名としてローカル名を使用します。すべてのパラメータのローカル名をユニークにする必要があります。複数のパラメータを同じ外部名にすることは可能ですが、ユニークな外部名とするほうがコードは読みやすくなります。

外部パラメータ名を指定

ローカルパラメータ名の前をスペースで区切って外部パラメータ名を記述します。

func someFunction(externalParameterName localParameterName: Int) {
    // パラメータの引数値を localParameterName で参照可能
}
NOTE
パラメータに外部パラメータ名を付けた場合、関数を呼び出すときには常に外部名を使用する必要があります。

関数 sayHello(_:) の次のバージョンは、2 人の名前を受け取り、双方に向けての挨拶を返します。

func sayHello(to person: String, and anotherPerson: String) -> String {
    return "Hello \(person) and \(anotherPerson)!"
}
print(sayHello(to: "Bill", and: "Ted"))
// "Hello Bill and Ted!" と出力

両パラメータに外部パラメータ名を指定することで、関数 sayHello(_:) の 1 つ目と 2 つ目の引数共に、呼び出すときにラベルを付ける必要があります。

外部パラメータ名を使用することで、関数の本体を読みやすく、意図を明確に維持したまま、表現力のある文章のように関数を呼び出すことができます。

外部パラメータ名を省略

関数の 2 つ目以降のパラメータに外部名を使用したくない場合には、明確な外部名ではなくアンダースコア (_) をパラメータに記述します。

func someFunction(firstParameterName: Int, _ secondParameterName: Int) {
    // 1 つ目と 2 つ目のパラメータの引数値を
    // firstParameterName と secondParameterName で参照
}
someFunction(1, 2)
NOTE
1 つ目のパラメータは、デフォルトで外部パラメータ名を省略するため、アンダースコアの記述とは無関係です。

パラメータのデフォルト値

パラメータの型の後に続けて値を代入することで、関数のどのパラメータにでもデフォルト値を定義することができます。デフォルト値が定義されている場合、関数を呼び出すときにそのパラメータを省略することができます。

func someFunction(parameterWithDefault: Int = 12) {
    // 関数の呼び出しに引数が渡されていない場合、
    // parameterWithDefault の値は 12
}
someFunction(6) // parameterWithDefault は 6
someFunction() // parameterWithDefault は 12
NOTE
関数のパラメータリストの最後にデフォルト値があるパラメータを置きます。こうすることで、その関数のすべての呼び出しでデフォルトが無い引数を同じ順序で使用し、同じ関数が呼び出されていることが明確になります。

可変長パラメータ

可変長(可変個)パラメータは、指定された型の値を 0 個以上受け取ります。関数を呼び出すときに、可変数の入力値を渡すことができるパラメータを指定するために、可変長パラメータを使用します。パラメータの型名の後にピリオドを 3 文字 (...) 挿入して可変長パラメータを記述します。

可変長パラメータに渡された値は、しかるべき型の配列として関数の本体内で使用できます。例として、名前が numbers で型が Double... の可変長パラメータは、型が [Double] の配列の定数 numbers として関数の本体内で使用できます。

次の例は、長さ不定の数値リストの算術平均を算出しています。

func arithmeticMean(numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// 5 つの数値の算術平均である 3.0 を返す
arithmeticMean(3, 8.25, 18.75)
// 3 つの数値の算術平均である 10.0 を返す
NOTE
関数の可変長パラメータは、最大で 1 つです。

入出力パラメータ

関数のパラメータはデフォルトで定数です。関数のパラメータの値をその関数の本体内で変更しようとすると、コンパイル時エラーになります。つまり、誤ってパラメータの値を変更してしまうことはありません。関数のパラメータの値を変更したい、かつ関数が終了した後もその変更を存続させたい場合には、そのパラメータを入出力パラメータとして定義します。

入出力パラメータを記述するには、そのパラメータのはじめに inout キーワードを置きます。入出力パラメータは関数に渡される値で、関数によって変更され、もとの値を置き換えるために関数の外に戻されます。入出力パラメータの詳細と、関連するコンパイラの最適化については、In-Out Parameters を確認してください。

入出力パラメータには、引数として変数のみ渡すことができます。定数とリテラルは変更することができないため、引数として定数またはリテラル値を渡すことはできません。入出力パラメータに引数として渡すとき、関数によって変更されることを示すアンパサンド (&) を変数名の前に置きます。

NOTE
入出力パラメータがデフォルト値を持つことはできません。可変長パラメータに inout を付けることはできません。

次の例は関数 swapTwoInts(_:_:) で、整数の入出力パラメータ a と b があります。

func swapTwoInts(inout a: Int, inout _ b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

関数 swapTwoInts(_:_:) は、b の値を a に、a の値を b に取り替えます。この関数は、一時定数 temporaryA に a の値をとっておき、b の値を a に代入し、そして temporaryA を b に代入します。

Int 型の 2 つの変数の値を交換するために、関数 swapTwoInts(_:_:) を呼び出すことができます。someInt と anotherInt は、関数 swapTwoInts(_:_:) に渡されるときに、名前にアンパサンドを前置していることに注目してください。

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// "someInt is now 107, and anotherInt is now 3" と出力

この例は、someInt と anotherInt がそもそも関数の外で定義されているにもかかわらず、もとの値が関数 swapTwoInts(_:_:) で変更されていることを示しています。

NOTE
入出力パラメータは、関数から返される値と同じではありません。swapTwoInts の例では、戻り値の型や値を定義していませんが、someInt と anotherInt の値を変更しています。入出力パラメータは、関数本体のスコープの外に影響がある別の方法です。

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.