【Swift】enumとstatic let(型プロパティ)による定数定義

iOS, Swift

はじめに

こんにちは。株式会社レコチョクの長島です。
2022年4月に新卒で入社し、NX開発推進部iOSアプリ開発グループに所属しています。
最近聞いている音楽は『アイドルマスター シンデレラガールズ U149』にて公開されたNightwearというシングルです。よろしくお願いします。

さて、現在私が関わっているプロダクトでは、以下のような形で、定数定義のために enumstatic letを用いたファイルが作成されています。

このような定数の定義方法を見たときに、以下の疑問を抱きました。

  • static letとは何なのか
  • 名前空間を分けて定数を定義するメリットは何なのか
  • 名前空間を分けるために enumを使うメリットは何なのか

上記の疑問点に関して、調べた結果をまとめていきます。

enumとstatic let(型プロパティ)

まず、 staticは、型自身に結びつくプロパティを定義することを可能にするSwiftの機能の1つです。
インスタンスを作成しなくても、 型名.staticプロパティ名のようにプロパティを呼び出すことができます。

型自身に結びつくため、 enumのRaw Valuesと異なる型を割り当てることが可能です。

enumを用いた定数定義のメリット

グローバルに定数を直置きした場合、下記のような形に定数が定義されます。しかしながら以下のような問題が生じます。

  • 同一の名前が定義できない
  • 何に関連する定数なのか一目で分からない
  • 定数名が長くなってしまう

上記のような問題が発生した場合は enumを用いて定数定義をすることで、名前空間ごとに整理・定数名の統一を行うことができます。

名前空間とは変数や定数、関数などが所属する領域のことです。これを活用することで、同じ名前の衝突を避けつつコードの可読性を向上できます。
下記の例では Constsという大きな名前空間の中に NumericsTitleSubTitleDescriptionという名前空間を作成しています。

定数を Consts.Title.sampleConsts.Numerics.smallといった形で呼び出すことができます。

これにより、以下のようなメリットが得られます。

  • 定数を呼び出す際に enumの変数名(例: Consts)から自動補完ができる
  • 名前空間ごとに、定数がどのような意味・位置付けなのかを理解しやすい
  • TitleNumericsの変数名から、文字列や数字が入ることを推測しやすくなる
  • それぞれの名前空間に対して同一の定数名( sample)を定義できる

そのため、グローバルに直に置くよりも定数を整理できます。

enumを使う意味

structclassでも同様に型プロパティを使って定数管理ができます。しかし、プロパティにアクセスする以外の目的はないにもかかわらず、意味のないインスタンスを作成できてしまうという問題が発生します。

この問題はイニシャライザの書き方を工夫することで回避できますが、単純に定数管理をしたい場合は enumを用いる方が早く解決することができます。
enumの初期化はこの形ではできず、また caseが存在しなくても問題なく動作するため、無意味なインスタンスの作成を確実に防ぐことができます。

このような性質から、どこかで定数定義をしたい場合、 structclassではなく enumを使うことが望ましいです。

おわりに

調査した結果、以下のことがわかりました。

  • static letを用いることで、型自体に結びつくプロパティを定義することができる
  • 名前空間を分けて定数を定義することで、グローバルに置くよりも整理できる
  • 名前空間を分けるため、 enumを用いることで自動補完などのメリットが得られる
  • enumを使うことで、無意味なインスタンスの作成を確実に防ぐことができる

この記事で、定数定義の際に enumstatic letを用いる理由についての理解を深める一助となれば幸いです。

参考資料

iOS, Swift