Swiftジェネリクスの基本と型の再利用方法をやさしく解説!初心者向け完全ガイド
生徒
「Swiftって型がいろいろあるって聞いたんですけど、毎回同じような処理を別々に書かないといけないんですか?」
先生
「いい質問ですね。Swiftでは“ジェネリクス”という便利な仕組みを使えば、型に関係なく同じコードを使いまわせるんですよ。」
生徒
「えっ!?型に関係なくって、どういうことですか?」
先生
「では、Swiftのジェネリクスの基本と、型の再利用の仕方について一緒に見ていきましょう!」
1. ジェネリクスとは?初心者にもわかるやさしい説明
Swift(スイフト)のジェネリクスとは、型(たとえばIntやStringなど)に関係なく、同じような処理を一つのコードで使いまわせる機能です。
たとえば、「2つの値を入れ替える関数」を考えてみましょう。もしジェネリクスがなければ、Int用、String用、Double用といった具合に、毎回別々に書かないといけません。
でもジェネリクスを使えば、どんな型でも1つの関数で対応できるのです。
2. ジェネリクスを使わないとどうなる?
まずは、ジェネリクスを使わない場合の「2つの値を入れ替える」関数を見てみましょう。
func swapInt(_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}
func swapString(_ a: inout String, _ b: inout String) {
let temp = a
a = b
b = temp
}
このように、型が違うだけでまったく同じ処理を2回書く必要があります。これでは、効率が悪いですよね。
3. ジェネリクスを使えば、もっとシンプルに!
次に、ジェネリクスを使って型に依存しない入れ替え関数を作ってみましょう。
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
ここでの<T>は型パラメータと呼ばれるもので、「この関数では、Tという名前の型を使いますよ」という意味です。実際に呼び出すときには、IntやStringなど、具体的な型が自動的に補完されます。
4. 実際に使ってみよう!
先ほどのswapValues関数を、Int型とString型で使ってみましょう。
var x = 5
var y = 10
swapValues(&x, &y)
print("x = \(x), y = \(y)")
var name1 = "Apple"
var name2 = "Banana"
swapValues(&name1, &name2)
print("name1 = \(name1), name2 = \(name2)")
x = 10, y = 5
name1 = Banana, name2 = Apple
このように、同じ関数を使って、IntでもStringでも入れ替え処理ができます。これがジェネリクスのすごいところです。
5. 型パラメータTってなんですか?
ジェネリクスでよく出てくる「T」は、Type(型)の頭文字です。必ずしも「T」である必要はなく、「U」や「Element」など、自分でわかりやすい名前にしてもOKです。
でも、慣例的に「T」がよく使われます。
つまり、Tというのは「この部分はあとで好きな型を入れられますよ!」という場所だと思ってください。
6. ジェネリクスを使った構造体の例
関数だけでなく、構造体(struct)やクラス(class)でもジェネリクスは使えます。次は、どんな型でも保存できる「入れ物(Box)」の構造体を作ってみましょう。
struct Box<T> {
var value: T
func showValue() {
print("中身は \(value) です")
}
}
このようにすれば、Int型でもString型でも使える便利な構造体が作れます。
let intBox = Box(value: 123)
intBox.showValue()
let strBox = Box(value: "Swift")
strBox.showValue()
中身は 123 です
中身は Swift です
7. なぜジェネリクスを使うの?初心者向けにポイント整理
ジェネリクスを使う理由は、以下のようなメリットがあるからです。
- コードの再利用性が高まる:同じような処理を複数回書かなくて済む
- 安全に使える:コンパイル時に型がチェックされるので、型の間違いを防げる
- 読みやすく整理されたコード:無駄な重複が減って、スッキリしたコードになる
たとえば、「リストを作る」「値を取り出す」「比較する」など、どんな型でも同じ処理をしたいときに、ジェネリクスは大活躍します。
8. 型の制約(where句)は別の機会に
ジェネリクスには「型制約」という応用機能もあります。たとえば、「数値だけを使いたい」とか「特定のプロトコルに準拠している型だけ」などの条件をつけることもできます。
ただし、それは少し難易度が上がるので、今回は基本だけに絞って解説しました。