こんにちは!文系出身、独学で個人開発をしている「ゆとりくん」です????
当サイトでは自分が過去に躓いた内容を中心に、アプリ開発初心者の方に有益な情報を紹介しています。
今回のテーマは「列挙型の”ローバリュー”って、どう使うの?」です。
初心者の方が理解しやすいようになるべく優しい言葉でまとめましたので、ぜひ参考にしてみてください!
※本記事は、著者が学習した内容をまとめたものとなります。
内容の精査につきましては、執筆時の技術力で可能な限りの注意を払っていますが、万が一誤りがございましたらフォームからご一報いただけると幸いです。
この記事はこんな方におすすめ!
- ローバリューの基本的な使い方を知りたい!
- ローバリューを実際のアプリ開発でどのように利用するのか知りたい!
自分が躓いた点を中心に、初心者の方に向けて記事を書いています!
環境
この記事は以下のバージョン時点での情報をまとめています。
【XCode】15.3
【Swift】5.10
【iOS】17.1.2
【macOS】Sonoma 14.2
ローバリューってなに?
ローバリューとは、列挙型の各ケースに設定できる値のことです。
例えば、「曜日」を表す列挙型DayOfWeekがあるとします。
enum DayOfWeek{
case sunday
case monday
case tuesday
case wednesday
case thursday
case friday
case saturday
}
DayOfWeekの各ケースには、以下のように値を紐づけることができます。
この値のことをローバリューと呼びます。
enum DayOfWeek: String{
case sunday = "日曜日"
case monday = "月曜日"
case tuesday = "火曜日"
case wednesday = "水曜日"
case thursday = "木曜日"
case friday = "金曜日"
case saturday = "土曜日"
}
ローバリューを設定するメリットは、「列挙型のケース」という抽象的な表現と「ローバリュー」という具体的な値を紐付けすることで、各ケースが何を意味しているのか分かりやすくできることです。
ローバリューの使い方
この章では、ローバリューの実装手順について詳しく説明します。
ローバリューの実装手順
ローバリューの基本的な実装手順は以下の通りです。
「曜日」を表す列挙型DayOfWeekに、String型のローバリューを設定したい(sundayは”日曜日”, mondayは”月曜日”…のように文字列と紐付けしたい)場合には以下のように記述します。
//型名のあとに:とローバリューの型であるStringを記述する
enum DayOfWeek: String{
//ローバリューにはString型のみ設定可能
}
String型でなくInt型のローバリューを設定したい(sundayは1, mondayは2…のように数字と紐付けをしたい)場合には以下のように記述します。
enum DayOfWeek: Int{
//ローバリューにはInt型のみ設定可能
}
STEP1で指定した型と同じ型のローバリューを、ケース宣言の後に記述します。
//ローバリューはString型
enum DayOfWeek: String{
case sunday = "日曜日"
case monday = "月曜日"
case tuesday = "火曜日"
case wednesday = "水曜日"
case thursday = "木曜日"
case friday = "金曜日"
case saturday = "土曜日"
}
//ローバリューはInt型
enum DayOfWeek: Int{
case sunday = 1
case monday = 2
case tuesday = 3
case wednesday = 4
case thursday = 5
case friday = 6
case saturday = 7
}
ローバリューの注意点
ローバリューを実装する際、いくつか注意すべき点があるので説明します。
注意① ローバリューとして指定できる型には制限がある
ローバリューには、どんな型でも設定できるわけではありません。
ローバリューの型に指定できるのは、Int型、Double型、String型、Character型などのリテラルに変換可能な型です。
石川洋資, 西山勇世. [増補改訂第3版]Swift実践入門 直感的な文法と安全性を兼ね備えた言語. 技術評論社, 2021. p209
注意② 指定した型以外のローバリューは設定できない
たとえば、以下のコードはエラーとなります。
//ローバリューをInt型に指定
enum DayOfWeek: Int{
case sunday = 1
case monday = "月曜日" //String型のローバリューを宣言しているためエラーとなる
case tuesday = 3
case wednesday = 4
case thursday = 5
case friday = 6
case saturday = 7
}
注意③ ローバリューには複数の型を指定することはできない
ローバリューとして指定できる型は1つだけです。
//ローバリューの型を2つ指定しようとしているのでエラーとなる
enum DayOfWeek: Int, String{
case sunday = 1
case monday = 2
case tuesday = 3
case wednesday = 4
case thursday = 5
case friday = 6
case saturday = 7
}
注意④ ローバリューは重複できない
ローバリューは列挙型内で一意となる必要があります。
enum DayOfWeek: Int{
case sunday = 1
case monday = 1 //ローバリューが重複しているためエラーとなる
case tuesday = 3
case wednesday = 4
case thursday = 5
case friday = 6
case saturday = 7
}
ローバリューの応用知識
ここでは、知っておくとより理解が深まるローバリューの知識を説明します。
失敗可能イニシャライザの暗黙的用意
列挙型にローバリューを設定すると、失敗可能イニシャライザinit?(rawValue:)が暗黙的に用意されます。
失敗可能イニシャライザinit?(rawValue:)はローバリューを引数として受け取り、対応する列挙型のケースをインスタンス化します。
なお、受け取ったローバリューが列挙型内に存在しない場合にはnilを返します。
enum DayOfWeek: Int{
case sunday = 1
case monday = 2
case tuesday = 3
case wednesday = 4
case thursday = 5
case friday = 6
case saturday = 7
}
let day1 = DayOfWeek(rawValue: 4) //.wednesdayがインスタンス化される
let day2 = DayOfWeek(rawValue: 8) //DayOfWeekのローバリューに8は存在しないのでnilになる
プロパティrawValueの暗黙的用意
列挙型にローバリューを設定すると、プロパティrawValueが暗黙的に用意されます。
列挙型の各ケースインスタンスのrawValueプロパティにアクセスすることで、そのケースに紐づくローバリューを取得することができます。
enum DayOfWeek: String{
case sunday = "日曜日"
case monday = "月曜日"
case tuesday = "火曜日"
case wednesday = "水曜日"
case thursday = "木曜日"
case friday = "金曜日"
case saturday = "土曜日"
}
let testDay = DayOfWeek.friday
let rawValue = testDay.rawValue //定数rawValueには文字列"金曜日"が格納される
ローバリューとケースの相互変換
失敗可能イニシャライザinit?(rawValue:)とプロパティrawValueを用いることで、ケースからローバリューを、そしてローバリューからケースを、相互に生成することができます。
enum DayOfWeek: String{
case sunday = "日曜日"
case monday = "月曜日"
case tuesday = "火曜日"
case wednesday = "水曜日"
case thursday = "木曜日"
case friday = "金曜日"
case saturday = "土曜日"
}
//ケースからローバリューを生成
let testCase = DayOfWeek.sunday
let generatedRawValue = testCase.rawValue //定数generatedRawValueには"日曜日"が格納される
//ローバリューからケースを生成
let testRawValue = "火曜日"
let generatedCase = DayOfWeek(rawValue: testRawValue)! //定数generatedCaseには.tuesdayが格納される
ローバリューの暗黙的宣言
Int型やString型のローバリューでは、全てのケースに明示的にローバリューを指定しなくても、Swiftが暗黙的に値を設定してくれます。
以下の例では.sundayにのみローバリューを明示的に設定していますが、その他のケースにもローバリューが自動的に設定されます。ローバリューがInt型の場合、1つめのケースを基準に、それぞれ+1した値が初期値として暗黙的に設定されます。
enum DayOfWeek: Int{
case sunday = 1
case monday
case tuesday
case wednesday
case thursday
case friday
case saturday
}
DayOfWeek.monday.rawValue //2
DayOfWeek.saturday.rawValue //7
ローバリューが文字列型の場合、ケースの名称がそのまま文字列としてローバリューに設定されます。
enum DayOfWeek: String{
case sunday
case monday
case tuesday
case wednesday
case thursday
case friday = "金曜日"
case saturday = "土曜日"
}
DayOfWeek.sunday.rawValue //"sunday"
DayOfWeek.friday.rawValue //"金曜日"
アプリ開発での具体的な使用例
ローバリューはJSON⇆カスタムクラスの変換を行うときに作成する、CodingKeysの実装で利用されます。
気になる方はこちらをご覧ください。
おわりに
以上、参考になれば嬉しいです!
まだまだ勉強中ですので、間違い等ありましたらフォームよりご連絡ください????????
参考文献
- 石川洋資, 西山勇世. [増補改訂第3版]Swift実践入門 直感的な文法と安全性を兼ね備えた言語. 技術評論社, 2021. p209~210
- Apple Inc. “Enumerations”. Swift.org – Documentation, (参照 2024-04-29)
- Apple Inc. “RawRepresentable”. AppleDeveloper, (参照 2024-04-30)
- Apple Inc. “rawValue”. AppleDeveloper, (参照 2024-04-30)
- Apple Inc. “init(rawValue:)”. AppleDeveloper, (参照 2024-04-30)
- Apple Inc. “Encoding and Decoding Custom Types”. AppleDeveloper, (参照 2024-04-30)
コメント