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