【Swift入門】ジェネリクス(generics)の使い方を分かりやすく解説!

SwiftではIntやStringなどの型に左右されずに、柔軟に動作する関数やクラスを定義することができるジェネリクス(generics)という機能が用意されています。

この記事では、

・ジェネリクス(generics)とは
・ジェネリクスの考え方や使い方

というジェネリクス(generics)の基本的な解説から、

・ジェネリクスのクラスを使用する方法
・ジェネリックプロトコルの使い方

などの応用的な使い方に関しても解説していきます。

今回はそんなジェネリクス(generics)の使い方についてわかりやすく解説します!

※この記事ではSwift4.0を使用しています。

ジェネリクス(generics)とは

ジェネリクス(generics)とは、ユーザーが定義した要件に応じて、指定したタイプで柔軟に動作する再利用可能な関数や型を指定できる機能です。

ジェネリクスはSwiftの特徴的な機能の1つで多くの機能でジェネリクスは使用されています。

たとえば、Swiftの配列型やディクショナリ型(辞書)でも型に左右されずに値を格納したり取り出すことが可能です。

ジェネリクス関数の定義:

ジェネリクスを使用するには、関数名のあとに<T>を指定します。

<T>は型パラメータと呼ばれるもので、この関数ではTという型を使用することを意味しています。

<T>を指定すると、関数が呼び出されたときにSwiftのシステムで自動で適切な型に置き換えて処理を実行してくれます。

ジェネリクスの型は<T>でなくても構いせんが、慣例として<T>が使われています。

ジェネリクスの考え方・使い方

ここではジェネリクスの考え方や具体的な使い方について見ていきましょう。

通常の関数の使い方

以下はInt型の引数を2つ受け取ってInt型の値を返却する関数です。

関数で受け取る型が分かりきっている場合は、このような指定方法でも問題ありません。

しかし、もしFloat型やDouble型などの異なる引数を渡したい場合、この関数では以下のように小数点を含んだ引数を指定すると、コンパイルエラーになります。

次項ではそんな問題を解決するジェネリクスの基本的な使い方について解説します。

ジェネリクスの使い方

ジェネリクスを指定すると、1度の定義であらゆる型に対応することができます。

前項で型の異なる引数を関数に渡したいとき、通常なら関数のオーバーロードを作成する必要がありますが、ジェネリクスなら以下のように指定することでさまざまな型に対応可能です。

しかし、上記のサンプルを実行するとエラーとなります。

これは関数内でプラス演算子を使用しているため、ジェネリクス型はさまざまな「型」には対応していますが、+などの演算子については対応していないからです。

そのため、ジェネリクス型を指定した関数で演算処理を行う場合は、「関数名<T: Numeric」と指定することで、数値型要素を持つ関数であることを宣言する必要があります。

このプログラムを実行すると、Int型とDouble型の演算が1つの関数で実行できます。

ジェネリクスのクラスを使用する

クラス名の型にT型を指定することにより、クラスのインスタンス生成時にあらゆる型を指定することができます。

以下にジェネリクスを指定したクラスの記述方法を紹介します。

実行結果:

このようにインスタンス生成時にInt型やString型など柔軟に指定できることがわかりますね!

しかしジェネリクス型を指定する場合は、指定した型については意識しておかないと後々の処理で型の不整合がおきたりしますので注意しましょう。

ジェネリックプロトコルの使い方

ジェネリックプロトコル(Generic Protocol)はジェネリクスを使用したプロトコルです。

Protocol(プロトコル)はクラスの型や動作を決めておくための設計図のようなものです。

Swiftではプロトコルにもジェネリクスを使用することが可能です。

以下にプロトコルを定義し、Int型、String型のクラスを定義しています。

プロトコルでジェネリクスを使用するためには、定義内で「associatedtype T」のように任意の型を指定する必要があります。

プロトコルについて詳しく知りたい方は以下の記事を参考にしてください

まとめ

ここではSwiftのジェネリクス(generics)について、

・ジェネリクス(generics)とは
・ジェネリクスの考え方や使い方
・ジェネリクスのクラスを使用する方法
・ジェネリックプロトコルの使い方

などについて解説しました。

ジェネリクスはSwift特有の機能で、他言語からSwiftを学ぶ場合とっつきにくいイメージもあります。

しかしジェネリクスを使用すれば、型を気にせずにさまざまな処理を行うことができますので非常に便利です。

もしジェネリクスについて忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

ヤマシタ

エンジニア歴10年のフリーランスエンジニア。ITに関わるさまざまなコンテンツの企画・制作も行っています。
ITに関してはノウハウ系、ライフハック系、トレンド系など、200本以上の執筆経験があります。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説