カテゴリ: Swift 更新日: 2025/10/31

Swiftジェネリクスの基本と型の再利用方法をやさしく解説!初心者向け完全ガイド

Swift ジェネリクスの基本と型の再利用方法
Swift ジェネリクスの基本と型の再利用方法

先生と生徒の会話形式で理解しよう

生徒

「Swiftって型がいろいろあるって聞いたんですけど、毎回同じような処理を別々に書かないといけないんですか?」

先生

「いい質問ですね。Swiftでは“ジェネリクス”という便利な仕組みを使えば、型に関係なく同じコードを使いまわせるんですよ。」

生徒

「えっ!?型に関係なくって、どういうことですか?」

先生

「では、Swiftのジェネリクスの基本と、型の再利用の仕方について一緒に見ていきましょう!」

1. ジェネリクスとは?初心者にもわかるやさしい説明

1. ジェネリクスとは?初心者にもわかるやさしい説明
1. ジェネリクスとは?初心者にもわかるやさしい説明

Swift(スイフト)のジェネリクスとは、型(たとえばIntやStringなど)に関係なく、同じような処理を一つのコードで使いまわせる機能です。

たとえば、「2つの値を入れ替える関数」を考えてみましょう。もしジェネリクスがなければ、Int用、String用、Double用といった具合に、毎回別々に書かないといけません。

でもジェネリクスを使えば、どんな型でも1つの関数で対応できるのです。

2. ジェネリクスを使わないとどうなる?

2. ジェネリクスを使わないとどうなる?
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. ジェネリクスを使えば、もっとシンプルに!

3. ジェネリクスを使えば、もっとシンプルに!
3. ジェネリクスを使えば、もっとシンプルに!

次に、ジェネリクスを使って型に依存しない入れ替え関数を作ってみましょう。


func swapValues<T>(_ a: inout T, _ b: inout T) {
    let temp = a
    a = b
    b = temp
}

ここでの<T>型パラメータと呼ばれるもので、「この関数では、Tという名前の型を使いますよ」という意味です。実際に呼び出すときには、IntやStringなど、具体的な型が自動的に補完されます。

4. 実際に使ってみよう!

4. 実際に使ってみよう!
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ってなんですか?

5. 型パラメータTってなんですか?
5. 型パラメータTってなんですか?

ジェネリクスでよく出てくる「T」は、Type(型)の頭文字です。必ずしも「T」である必要はなく、「U」や「Element」など、自分でわかりやすい名前にしてもOKです。

でも、慣例的に「T」がよく使われます。

つまり、Tというのは「この部分はあとで好きな型を入れられますよ!」という場所だと思ってください。

6. ジェネリクスを使った構造体の例

6. ジェネリクスを使った構造体の例
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. なぜジェネリクスを使うの?初心者向けにポイント整理

7. なぜジェネリクスを使うの?初心者向けにポイント整理
7. なぜジェネリクスを使うの?初心者向けにポイント整理

ジェネリクスを使う理由は、以下のようなメリットがあるからです。

  • コードの再利用性が高まる:同じような処理を複数回書かなくて済む
  • 安全に使える:コンパイル時に型がチェックされるので、型の間違いを防げる
  • 読みやすく整理されたコード:無駄な重複が減って、スッキリしたコードになる

たとえば、「リストを作る」「値を取り出す」「比較する」など、どんな型でも同じ処理をしたいときに、ジェネリクスは大活躍します。

8. 型の制約(where句)は別の機会に

8. 型の制約(where句)は別の機会に
8. 型の制約(where句)は別の機会に

ジェネリクスには「型制約」という応用機能もあります。たとえば、「数値だけを使いたい」とか「特定のプロトコルに準拠している型だけ」などの条件をつけることもできます。

ただし、それは少し難易度が上がるので、今回は基本だけに絞って解説しました。

カテゴリの一覧へ
新着記事
Go言語の関数でエラーハンドリングする基本的な方法
Go言語のスライス・マップ・配列をまとめて比較してみよう!初心者でもわかる使い分けの基本
Go言語の条件分岐の見やすい書き方を徹底解説!初心者でもわかるif文の使い方
Go言語とは何か?初心者向けに特徴・できること・インストール手順までやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.2
Java&Spring記事人気No2
Go言語で条件式を1行で書くコツ!三項演算子の代替と短縮記法
No.3
Java&Spring記事人気No3
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.4
Java&Spring記事人気No4
Kotlinのデータクラス(data class)とは?便利な特徴と使い方を初心者向けにやさしく解説!