【Swift/SwiftUI】列挙型でイニシャライザを定義

本記事では列挙型データ内でイニシャライザを用意して使用する方法を解説していきます。

SwiftUIでアプリを設計していると、enum(列挙型)を使う場面は非常に多くなります。画面状態の管理、難易度の定義、タブの切り替え、アラート種別など、UIロジックと相性が良いのが特徴です。

Swiftのenum(列挙型)は「値の集合」を表すための型ですが、実はそれだけではありません。enumにはイニシャライザ(initializer)を定義することができ、外部から受け取った値を安全に列挙型へ変換する重要な役割を持っています。

なお、列挙型データの宣言方法については以下の記事で解説していますのでそちらをご確認ください。

イニシャライザの役割

イニシャライザとは、外部から渡された値を安全にメンバに代入する役割を持った機能です。

数値や文字列型などの外部データをそのまま使うのではなく、正しい値に変換してから各メンバに代入することができる初期処理です。

例えば、APIレスポンスやUserDefaultsから取得した値は、文字列や数値であることがほとんどです。それらをそのまま扱うのではなく、型安全なenumに変換することでバグの発生を防ぎます。

つまりイニシャライザとは、enumへの不正な値の代入を防ぎ、各メンバと外部データのやり取りを行うとういう重要な役割を担っています。


通常、構造体やクラスのイニシャライザは「インスタンスを生成するためのもの」というイメージがあると思います。enumのイニシャライザも基本的には同じですが、役割の重みが少し違います。

IOSアプリ開発では、APIレスポンス、UserDefaults、URLパラメータ、ユーザー入力など、さまざまな外部データを扱います。これらは文字列や数値として渡されることが多く、そのまま使うとタイプミスや不正値によるバグの原因になります。

そこで、外部データを一度enumに変換し、「取りうる値を制限する」ことで安全性を高めることが出来ます。

イニシャライザを定義

イニシャライザは、以下のように「init」という名称で関数のように作成します。

以下は各メンバの値を文字列を指定された場合にその文字列を参照してケースごとに対応する値を返却する例です。

enum OperatingSystem: Int {
    case mac = 0
    case windows = 1
    case chrome = 2
    case linux = 3

    init?(name: String) {
        switch name.lowercased() {
        case "mac":
            self = .mac
        case "windows":
            self = .windows
        case "chrome":
            self = .chrome
        case "linux":
            self = .linux
        default:
            return nil
        }
    }
}

init?としているのは、定義しているもの以外が指定して呼び出された場合にnilを返却するオプショナル型としているためです。

self = .macという書き方でメンバの値を返却することができます。列挙型では、インスタンス生成とはどのメンバかを決定することそのものです。そのため、selfに直接caseを代入する形になります。

呼び出し方は以下のようになり、戻り値はOptionalの列挙型データが返却されます。

let os = OperatingSystem(name: "windows")
print(os) // Optional(windows)

また、イニシャライザを列挙型内部に置くことによって、アプリケーションのさまざまな場所で分岐処理を用いて戻り値の検証を行わずに済むというのも大きなメリットです。

以下のようにさまざまな場所にデータの分岐処理を書いてしまうと保守性が非常に低いアプリケーションになってしまいます。

if string == "mac" {
   ...
}else if string == "windows" {
   ...
}

最後に

本記事ではenumでのイニシャライザの役割と使用方法について解説してきました。イニシャライザは単純な列挙データの初期処理ではなく、以下の機能を実現する重要な仕組みです。

  • 外部からのデータを安全に変換する
  • 返却するデータの型を保証する
  • 変換ロジックを内部に保有することで保守性を高める


特にSwiftUIを用いたアプリケーションでは、APIや永続化データの変換が頻繁に発生します。その際にenumイニシャライザを適切に設計できるかどうかで、コードの安全性と可読性が大きく変わります。


ぜひイニシャライザを活用して、より安全で美しいSwiftコードを書いてみてください。

他にもSwiftで頻繁に使用するオプショナル型データのアンラップ方法や配列で使用可能なメソッド・プロパティの一覧なども紹介していますのでそちらもご覧くださいませ。