ベルマークのない自由帳

ベルマークのない自由帳

有益と無益の境界例

iOS開発メモ No.24 -Genericsとは-

ちょくちょく目にするようになったジェネリクス(Generics)という言葉。
ジェネリック薬品とトットちゃんしか思いつかないので、調べてみた。

Generics

generic[dʒənérɪk]:一般的な、包括的な、総称的な

今では多くのプログラミング言語にある「型を明示せずに変数や関数を利用可能にする機能」のこと。
データ形式に依存しない」とか「再利用可能な」とか言われることもある。
静的型付けしか受け付けない言語では関数やメソッドを実装するたびに、異なる型で書き直す(overload)する必要がある。
それに対してジェネリクスは型を「パラメータ」として指定して、インスタンス化することで「その型を受け取れる関数やメソッド」を生成できる。

Swiftの関数で確認

静的型付けの関数

Int型の引数を指定してInt型で返す関数にDouble型を渡すとエラー。
Double型にも対応したければ引数と返り値にDoubleを指定する必要がある。
(そのとき、引数だけDoubleにして返り値の型をIntにしても暗黙的にキャストはされずエラーになる)

func additionFunc(num1: Int, num2: Int) -> Int {
    return num1 + num2
}

print(additionFunc(num1:10, num2:20))
    ->30
print(additionFunc(num1:10.0, num2:20.0))
    ->error: cannot convert value of type 'Double' to expected argument type 'Int'

ジェネリクスな関数

型の代わりにジェネリックパラメータを指定してあげる。
(慣例としてTが用いられるけどHogeとかにしても問題なく動く)
<T: Numeric>Numericがないと関数内で+, -, *, /などの演算子を使うことができない。
いわゆる魔法のじゅもん。

func additionFunc<T: Numeric>(num1: T, num2: T) -> T {
    return num1 + num2
}

print(additionFunc(num1: 10, num2: 20))
    -> 30
print(additionFunc(num1: 10.0, num2: 20.0))
    -> 30.0

参考にしたページ。
https://qiita.com/shoheiyokoyama/items/31eca0d4b27bc9608eb8
http://e-words.jp/w/%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AA%E3%82%AF%E3%82%B9.html
https://www.sejuku.net/blog/36319