ジェネリクス関数
通常の関数は、引数の型を決めたり、返り値の型を決めなければいけません。
しかし、ジェネリクト関数では、Int型でもString型でもどんな型でも対応してくれることができます。
書き方はこんな感じ。
//ジェネリクスを指定
func sample<T>(x:T, y:T) -> T {
return x + y
}
ジェネリクス関数を使用したい時は、関数名の後ろにをつけます。Tじゃなくても良いんですが、一般的にはT。
これだと関数内で演算が行われることになるので、その場合は数値でないといけなくなります。
その場合は下記のように「関数名<T: Numeric」と指定することで、数値型要素を持つ関数であることを宣言します。
//ジェネリクスを指定
func sample<T:Numeric>(x:T,y:T) -> T {
return x + y
}
こうすることで、Int, Double, Floatなど数値型であればどの型にも対応することが可能になります。
ジェネリクスプロトコル
プロトコルにジェネリクスを使用することで、Int型とString型のクラスを定義したりすることができます。
//プロトコルの定義
protocol FruitsProtocol {
associatedtype T
var item:T { get }
func fruitvalue(item:T)
}
//クラス(Int型)
class Fruits1:FruitsProtocol {
var item:Int = 100
func fruitvalue(item: Int) {
self.item += 100
}
}
//クラス(String型)
class Fruits2:FruitsProtocol {
var item:String = "100"
func fruitvalue(item: String) {
self.item = item + "円です"
}
}
プロトコルでジェネリクスを使用する時は、
associatedtype T
のように任意の型を指定します。
参考
[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)