Swift・iOS

Swiftを中心に学んだことを記録に残すブログです。技術に関係ない記事もたまに書いています。

【Swift】ジェネリクスとは

■はじめに

GitHubに上がっているコードを読んでいたところ、ジェネリクスが使われていたので調べてみました。

 

ジェネリクスとは

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

「型を気にせずにさまざまな処理を行うことができますので非常に便利です。」

【Swift入門】ジェネリクス(generics)の使い方を分かりやすく解説! | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

 

■そもそもジェネリクス使わずにできないの?

ジェネリクスを使わない場合でもできますが、型に左右されずに値を取り出すには、型ごとに同様の関数をオーバーロードする必要があります。

以下、xとyが等しいか返す「return x == y」をInt型でもFloat型でも返すために、オーバーロードしています。

     //ジェネリクス使わない場合
        func isEqual(x: Int, y: Int) -> Bool {
            return x == y
        }
    
        func isEqual(x: Float, y:Float) -> Bool {
            return x == y
        }

 ジェネリクスを使えば、オーバーロードしなくても複数の型で汎用的な処理をすることができます。

    // ジェネリクス使う
    func isEqual<T: Equatable>(x: T, y: T) -> Bool {
        return x == y
    }

 

■Any型使えばよいのでは?

Any型はどのような型でも表現できるものの、Any型をString型、Int型などの具体的な型として扱う場合はダウンキャストが必要です。

ダウンキャストしない場合、戻り値はあくまでAny型になるため、型が明示されていないままです。そのため、型の安全性が保たれていない状態になってしまいます。

一方でジェネリクス型であれば型引数に応じて戻り値の型も変化するため、型の安全性が保たれた状態になります。

 

■おわりに

ジェネリクスの概要に関して調べたので、今後は実践的な使われ方に関して見ていこうと思います。

 

■関連リンク/参考文献

【Swift入門】ジェネリクス(generics)の使い方を分かりやすく解説! | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

石川 洋資 西山 勇世 (2018) [改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)