筆者がいろんな言語を使用してきて、他の言語と異なる気になると感じたSwiftで押さえておきたい構文を「なにが出来るの?」といった視点で紹介していきます。

 

今回はEnumについて公式サイトの説明を使用しながら解りやすく解説していきます

  

C,C++,JavaでEnumを扱ってきましたがSwiftでEnumを使用するコードを見た時

  「rawValue」???

  「宣言に case を使用」???

  「使用箇所に メンバ名の先頭に"."を付加して使用」???

  「型推論」???

でした。

この記事にて順に説明していますので、是非使い熟して???を解消しましょう。

Enum?


Enum(列挙型)は、関連する値のグループに共通の型を定義しコード内で安全にそれらの値を操作できるようにします。

 

SwiftのEnumの特徴

  • 列挙の各ケースに値を設定するしなくてもよい
  • 文字列、文字、または任意の整数型または浮動小数点型の値にすることができる。
  • ネストすることができる
  • メソッドを定義することができる
  • 割り当てられた値にアクセスするにはrawValueを参照する

 

Swiftの列挙値に関する追加情報を提供する計算されたプロパティや、列挙値に関連する機能を提供するインスタンスメソッドなど、従来はクラスによってのみサポートされていた多くの機能を採用しています。

列挙型では、イニシャライザを定義して初期値を設定し使用することもできます。

extensionを使用して機能拡張することができます。また、プロトコルに準拠して標準機能を提供することもできます。

 

列挙型で”できる事”


  • 関連する値のグループを共通の型として定義できる
  • 値を設定せずに使用することができる
  • 文字列、文字、整数型、浮動小数点型の値を設定する事が出来る
  • 初期ケース値を設定する事ができる
  • Extensionを使用して拡張することができる

Enumの構文


enum キーワードを使用して列挙宣言しそれらの定義全体を1対の中括弧で囲みます。

caseキーワードを使用して、列挙要素を記述し、値を設定せずに使用することができます。

  

// 定義
enum Month {
  case January
  case February
  case March
  case April
  case May
  case June
  case August
  case September
  case October
  case November
  case December
}

 

// 
func enumprint() {
  print("\(Month.January)です")
  print("\(Month.February)です")
  print("\(Month.March)です")
  print("\(Month.April)です")
  print("\(Month.May)です")
}

結果
Januaryです
Februaryです
Marchです
Aprilです
Mayです

 

・複数のケースをコンマで区切りで1行で記述することもできます。

enum Month {
	case January,February,March,April,May
}

 

・Switchステートメントを使用して列挙値を一致させることができます。

一度初期化した後は、型推論されるので次からはドット(.)を使用して別の値を設定(thisMonth = .Marchなど)もできます。

thisMonth = Month.February
switch thisMonth{
	case .January:
		print("1月だよ")
	case .February:
		print("2月です")
	default:
		print("今月は\(thisMonth)")
}
//  Prints "2月です"

  

列挙型ではすべてのケースコレクションにアクセスするには列挙型の名前の後に: CaseIterableを記述します。CaseIterableのプロトコルに準拠して列挙型のallCasesプロパティにアクセスして列挙子を配列として扱う事ができます。

enum Emotions: CaseIterable{
	case joy, anger,sorrow
}

let numberOfChoices = Emotions.allCases.count
print("\(numberOfChoices) major emotions"
// Prints "3 major emotions"

 

for文を使用してすべてのケースに順にアクセスすることもできます。

for emotions in Emotions.allCases {
  print(emotions)
}
// joy
// anger
// sorrow

 

異なる型を定義して使用できます。

enum Barcode {
	case upc(Int, Int, Int, Int)
  case qrCode(String)
}

var productBarcode = Barcode.upc(8,85909,51226,3)

productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

switch productBarcode {
  case .upc(let numberSysgtem, let manufacture, let product, let check ):
		print("UPC:\(numberSystem), \(manufacture), \(product), \(check.")
  case .qrCode(let productCode):
		print("QR code: \(productCode).")
}

// Prints "QR code: ABCDEFGHIJKLMNOP."

  

 

Raw Values(文字列、文字、整数型、浮動小数点型の値を設定)


 

文字列、文字、整数型、浮動小数点型の値を格納する列挙型の場合、ケースごとに値を割り当てる必要はありません、割り当てない場合は自動で値が割り当てられます。

整数が使用される場合、各ケースの暗黙の値は前のケースよりも1大きくなります。

最初のケースに値が設定背されていない場合、その値は0です。

 

enum Week: Int{
  case Monday= 1, Tuesday, Wednesday,Thursday, Friday, Saturday, Sunday
}

enum Motion: String {
  case front, rear, left, right, up, down
}

 

Weekのケースでは、Week.Tuesday.rowValue = 2, Week.Wednesday.rowValue = 3…となります。

Motionのケースでは、Motion.rear.rawValue = “rear”

 

・範囲外の初期化値を指定した場合は、nilとなります。

positionToFind = 8
if let  dayOfTheWeek = Week(rawValue: positionToFind) {
}
else {
  print("There isn't a Week at position\(positionToFind)")
}
// Prints "There isn't a Week at position 8"

 

最後に

最後までお読みいただきありがとうございました。今後も気になる構文を紹介していきたいと思いますので是非よろしくお願いいたします。ご意見などありましたらメッセージ頂けますと幸いです。

 

「Protocol」で”できる事”について以下の記事で紹介していますのでよかったら参照してみてください。

Swift 押さえておきたい構文 「Protocol」で”できる事”

    筆者がいろんな言語を使用してきて、他の言語と異なる気になると感じたSwiftで押さえておきたい構文を「なにが出来るの?」といった視点で紹介していきます。 今回…

  

参考:Swift公式