質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1256閲覧

Swiftのジェネリクスの説明を何度読んでも分かりません

tmiyachi

総合スコア47

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/05/05 10:07

編集2016/05/05 14:32

Swiftの基本文法はだいたい押さえたのですが、ジェネリクスだけはよくわかりません。

インスタンス生成側、メソッド呼び出し側で型を指定できるように、定義の時点では型を汎用にしておく、ということは理解できていますが、

定義の仕方や使い方、使うシーンが分かりません。

実際の実例を入れながら、初級者にも分かるようにご説明いただけないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ジェネリクスはSwift以外の言語にもある考え方です(内容としては同じです)。ちょっと回り道になるかもしれませんが、ジェネリクスという考え方が出てくるまでの歴史的背景から簡単に紹介します(多分、その方が理解しやすいと思うので)。

古い言語(例えば、C)では、扱うデータ型が異なるだけで処理内容が同じというような場合、処理名(関数名やメソッド名)は全く違う名前で定義する必要がありました。例えば、足し算をするような処理でも、Int型のデータを扱う場合はIntAdd、Float型の場合はFloatAddと言った具合にです。

C

1int IntAdd(int a, int b) 2{ 3 int ans; 4 5 ans = a + b; 6 return ans; 7} 8 9float FloatAdd(float a, float b) 10{ 11 float ans; 12 13 ans = a + b; 14 return ans; 15}

これですと、使う側に使う処理を強く意識させることとなり、開発効率があまり良くありません。
やがて、オブジェクト指向という概念が出てきました。オブジェクト指向では関数オーバーロードという考え方があり、扱うデータ(戻り値や引数)の型が異なれば処理名は同じでも構わないという書き方ができるようになりました。

C++

1int Add(int a, int b) 2{ 3 int ans; 4 5 ans = a + b; 6 return ans; 7} 8 9float Add(float a, float b) 10{ 11 float ans; 12 13 ans = a + b; 14 return ans; 15}

これにより、使う側は「足し算をする時はAddを使えばいい」ということだけを意識すればいいようになりました。
使う側とすれば便利にはなりましたが、作る側は(必要な)データ型の数の分だけ用意した処理を開発/保守していかなければいけません。例えば、同様な修正が全てに入るような場合、該当するすべての処理に手を入れていかなければなりません(当然ですが)。そこで、定義時はあまり型を強く意識しないようにし、利用時に該当するデータ型に適宜展開して処理できるようにする書き方としてジェネリクスができました。つまり、保守の効率化を図ったのがジェネリクスということになります(私はそう捉えています)。

長くなりましたが、大雑把に言えばこんな感じです。後は以下のページを見てみてはいかがでしょうか。
Swift言語を学ぶ - ジェネリクス
Swiftのジェネリクスについてのメモ
Codable Tech BLog - Swiftジェネリックス

投稿2016/05/05 15:57

archiver

総合スコア1557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmiyachi

2016/05/06 01:25

理解できました、ありがとうございます! 定義側と呼び出し側の両方の便宜を考えればいいのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問