次は、一般的な、ジェネリックでない関数 swapTwoInts(_:_:) で、2 つの Int 値を交換します。

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

この関数は、In-Out Parameters で説明されているように、a と b の値を交換するために入出力パラメータを使用しています。

swapTwoInts(_:_:) 関数は、b のもとの値を a に、a のもとの値を b に入れ替えます。2 つの Int 変数の値を交換するために、この関数を呼び出すことができます。

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" と出力

swapTwoInts(_:_:) 関数は役に立ちますが、Int 値にしか利用できません。2 つの String 値や、2 つの Double 値を交換したい場合、次に示す swapTwoStrings(_:_:) や swapTwoDoubles(_:_:) 関数のように、さらに関数を記述する必要があります。

func swapTwoStrings(inout a: String, inout _ b: String) {
    let temporaryA = a
    a = b
    b = temporaryA
}

func swapTwoDoubles(inout a: Double, inout _ b: Double) {
    let temporaryA = a
    a = b
    b = temporaryA
}

swapTwoInts(_:_:)swapTwoStrings(_:_:)swapTwoDoubles(_:_:) 関数の本体がまったく同じであることに気付かれたかもしれません。違っているのは、受け取る値の型 (IntStringDouble) だけです。

あらゆる型の 2 つの値を交換できる関数を記述できれば、さらに役に立ち、より柔軟です。ジェネリックコードで、そのような関数を記述できるようになります。

NOTE
3 つの関数はすべて、a と b が同じ型で定義されていることが重要です。a と b が同じ型でない場合、値を交換することができません。Swift は型安全(タイプセーフ)な言語で、(例えば)String 型の変数と Double 型の変数の値を交換することはできません。そうしようとすると、コンパイル時エラーとなります。

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.