IT工房くまや

通称くまが運営するIT工房サイト

Swiftのenumについて調べてみました

enumは列挙型と呼ばれます。

enum Seasons {
    case Spring
    case Summer
    case Autumn
    case Winter
}

のように主にcaseを用いて定義されます。それから、switch式とよく組み合わせて使います。

var myFavorite = Seasons.Spring

switch myFavorite {
    case .Spring:
        print("どことなく気持ちが浮かれますよね")
    case .Summer:
        print("何かしなくちゃって気がせきますね")
    case .Autumn:
        print("旅に出たくなりますよね")
    case .Winter:
        print("一人が落ち着きますよね")
}

//どことなく気持ちが浮かれますよね

CaseIterableプロトコルに準拠させるとcaseを配列のように扱えます。但しcaseをassociated Valueとするとエラーになります。

enum Seasons: CaseIterable {
    case Spring
    case Summer
    case Autumn
    case Winter
}

これはOKですが、caseをassociated Valueにして見ると

enum Seasons: CaseIterable {
    case Spring(month: String)
    case Summer(month: String)
    case Autumn(month: String)
    case Winter(month: String)
}

これはエラーになります。しかし、associated ValueでもallCaseを使いたいケースもあります。そんな時はallCaseを具体的な値の配列で定義してあげれば使えます。例えば

enum E干支時刻: CaseIterable {
	//associated Value
	case eto(kanji: String, yomi: String, startJi: Int, shouJi: Int, endJi: Int)

	//CaseIterableプロトコルに準拠させる為
	//allCasesをassociated Valueを具体化して定義します。
	static var allCases: [E干支時刻] {
		return [.eto(kanji: "子", yomi: "ね", startJi: 23, shouJi: 0, endJi: 1),
			.eto(kanji: "丑", yomi: "うし", startJi: 1, shouJi: 2, endJi: 3),
			.eto(kanji: "寅", yomi: "とら", startJi: 3, shouJi: 4, endJi: 5),
			.eto(kanji: "卯", yomi: "う", startJi: 5, shouJi: 6, endJi: 7),
			.eto(kanji: "辰", yomi: "たつ", startJi: 7, shouJi: 8, endJi: 9),
			.eto(kanji: "巳", yomi: "み", startJi: 9, shouJi: 10, endJi: 11),
			.eto(kanji: "午", yomi: "うま", startJi: 11, shouJi: 12, endJi: 13),
			.eto(kanji: "未", yomi: "ひつじ", startJi: 13, shouJi: 14, endJi: 15),
			.eto(kanji: "申", yomi: "さる", startJi: 15, shouJi: 16, endJi: 17),
			.eto(kanji: "酉", yomi: "とり", startJi: 17, shouJi: 18, endJi: 19),
			.eto(kanji: "戌", yomi: "いぬ", startJi: 19, shouJi: 20, endJi: 21),
			.eto(kanji: "亥", yomi: "い", startJi: 21, shouJi: 22, endJi: 23)]
	}
}

こんな感じです。これをforEachで回してみます。

E干支時刻.allCases.forEach { e干支時刻 in
	switch e干支時刻 {
	case .eto(let kanji, let yomi, let startJi, let shouJi, let endJi):
			print("\(kanji)(\(yomi))の刻は \(startJi)時から\(endJi)時です。正\(kanji)は\(shouJi)時です。")
	}
}
/*
子(ね)の刻は 23時から1時です。正子は0時です。
丑(うし)の刻は 1時から3時です。正丑は2時です。
寅(とら)の刻は 3時から5時です。正寅は4時です。
卯(う)の刻は 5時から7時です。正卯は6時です。
辰(たつ)の刻は 7時から9時です。正辰は8時です。
巳(み)の刻は 9時から11時です。正巳は10時です。
午(うま)の刻は 11時から13時です。正午は12時です。
未(ひつじ)の刻は 13時から15時です。正未は14時です。
申(さる)の刻は 15時から17時です。正申は16時です。
酉(とり)の刻は 17時から19時です。正酉は18時です。
戌(いぬ)の刻は 19時から21時です。正戌は20時です。
亥(い)の刻は 21時から23時です。正亥は22時です。
*/

こんな感じになります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です