今回はジェネリクスについて説明しようと思います。(ジェネリックだったりジェネリックスだったりいうこともありますが、今回はジェネリクスに統一しています。)
ジェネリクスの概要
ジェネリクスとは?
ジェネリクスとはSwiftの機能の一つで、クラスやストラクチャ内で使用する型や関数の引数として受け取る型を抽象的に宣言できる機能です。引数の型を抽象化することで、柔軟で再利用しやすいコードを書くことができます。こういったものを「ジェネリクス型」「ジェネリクス関数」などといいます。
ジェネリクスが使用されている例
では実際にジェネリクスな型とはどういったものでしょう?
最も身近なものだとArray型です。ArrayにはIntやStringといった様々な型の値を格納することができますよね。あれもジェネリクスを使用しているからです。
ジェネリクスの使い方
では実際にはどのように使用するのでしょ?
ジェネリクス型
ジェネリクス型の定義
ジェネリクス型の定義方法はこんな感じです。
struct 構造体名<T> {
...
}
class クラス名<T> {
...
}
enum 列挙型名<T> {
...
}
構造体名やクラス名の後に<T>をつけます。このTが抽象化された型をさしています。Tでなく他の任意の文字でもいいのですが、Tと宣言されることが一般的です。
ジェネリクス型の使用
ではジェネリクスを指定したクラスの記述方法を紹介します。
class Sample<T> {
var item: T
init(item: T) {
self.item = item
}
}
let sample1 = Sample(item: 10)
let sample2 = Sample(item: "テキスト")
このようにインスタンス生成時にInt型やString型などを指定することができます。
ジェネリクス関数
ジェネリクス関数の定義
ジェネリクス関数の定義はこのような感じです。
func 関数名<T>() {
...
}
ジェネリクス型と何も変わらないですね。
ジェネリクス関数の使用
今回は与えられた2つの値をタプルとして返すだけの関数を考えます。
タプルについてはこちら -> https://shuhey-hashimoto.com/swift/【知ってると便利!】swiftにおけるタプルの役割と/
func sample<T>(_ a: T, _ b: T) -> (T, T) {
return (a, b)
}
let sample1 = sample<Int>(1,2)
let sample2 = sample<String>("a", "b")
非常に簡単ですね。
最後に
様々な型を使用することができるので非常に便利ですが、それ故に意識して使用しないと思わぬ不具合の原因になりかねません。使用する際は気をつけましょう
コメント
[…] 前回はジェネリクスの概要についてめちゃめちゃざっくりと簡単な説明をしました。今回はもう少しだけ詳しくジェネリクスの説明をしていこうと思います。お酒を飲みながら書いているので、間違っているところがあるかもしれないですが、その時はコメントから教えてください。 […]