Swift ジェネリクスとオーバーロード

汎用的な関数・メソッドを作りたい

汎用的とは?汎用的とは国語的には「広くいろいろな方面に用いること」のような意味ですが、この場合の汎用的は、「複数の種類の型の引数を受け取れる関数・メソッド」くらいの意味でしょうか。

sample1-1

func plus(_ x:Int,_ y:Int)->Int{
    return x+y
}

print(plus(1,1))
print(plus(1,12))
2
13

sample1-1はInt型の二つの引数x,yを受け取り、その和を返す関数plus()を定義しています。上記のようにx,yにInt型の引数が渡された場合その和を得ることができます。


sample1-2

func plus(_ x:Int,_ y:Int)->Int{
    return x+y
}

print(plus(1,1.2))
main.swift:7:14: error: cannot convert value of type 'Double' to expected argument type 'Int'
print(plus(1,1.2))
             ^~~
             Int( )

関数plus()は引数の型注釈(型アノテーション)をInt型に指定していますので、引数にInt型以外の型の値を渡されると(sample1-2ではdouble型の1.2が渡されている)コンパイルエラーが出ます。

Int(整数)型だけではなく少数も扱える関数が欲しい場合、どうすればよいか。

1.オーバーロード

sample2-1

func plus(_ x:Int,_ y:Int)->Int{
    return x+y
}

func plus(_ x:Float,_ y:Float)->Float{
    return x+y
}

print(plus(1.4,1.2))
2.6

上記のようにFloat型の引数をとるplus()関数を新たに定義すれば、オーバーロードの機能により、少数を引数に渡しても新たに定義したplus()関数が呼び出されます。

2.ジェネリック関数

上記のように必要な型の分だけオーバーロードのための関数を定義すればいいのですが、もっとシンプルにできないか?

そこでジェネリック関数です。

型の種類の数、同じ名前の関数を定義する(オーバーロード)のではなく、一回の関数定義で複数の型を扱える関数を作りたい。それがジェネリック関数。

~~ジェネリック関数の定義方法~~

func 関数名<型引数>(引数名:型引数)->戻り値の型{
    関数定義
}

 

コメントを残す

メールアドレスが公開されることはありません。