Swift 列挙型

列挙型は簡単に言えばデータ型の一種であり、このデータ型がカスタム定義された特定のデータのみを含むというだけで、共通の特性を持つデータの集合です。

Swift の列挙型は Objective-C や C の構造に似ています。列挙型の機能は次のとおりです:

  • クラス内で宣言され、クラスをインスタンス化することでその値にアクセスできます。

  • 列挙型はイニシャライザ(initializers)を定義して初期メンバー値を提供することもできます。また、元の実装に基づいて機能を拡張することもできます。

  • プロトコル(protocols)に準拠して標準的な機能を提供できます。

構文

Swift では enum キーワードを使用して列挙型を作成し、その定義全体を中括弧のペアの中に置きます:

enum enumname {
   // 枚举定义放在这里
}

例えば、曜日を表す以下の列挙型を定義します:

import Cocoa

// 定义枚举
enum DaysofaWeek {
    case Sunday
    case Monday
    case TUESDAY
    case WEDNESDAY
    case THURSDAY
    case FRIDAY
    case Saturday
}

var weekDay = DaysofaWeek.THURSDAY
weekDay = .THURSDAY
switch weekDay
{
case .Sunday:
    print("星期天")
case .Monday:
    print("星期一")
case .TUESDAY:
    print("星期二")
case .WEDNESDAY:
    print("星期三")
case .THURSDAY:
    print("星期四")
case .FRIDAY:
    print("星期五")
case .Saturday:
    print("星期六")
}

上記のプログラムを実行すると、出力結果は次のようになります:

木曜日

列挙型で定義された値(例:Sunday,Monday,……とSaturday)はこの列挙型のメンバー値(またはメンバー)。caseキーワードは、新しいメンバー値の行が定義されることを示します。

注意:C や Objective-C とは異なり、Swift の列挙メンバーは作成時にデフォルトの整数値が割り当てられることはありません。上記のDaysofaWeek例の中で、Sunday,Monday,……とSaturday暗黙的に代入されることはありません0,1,……と6。逆に、これらの列挙メンバー自体が完全な値を持っており、これらの値は明確に定義されたDaysofaWeek型です。

var weekDay = DaysofaWeek.THURSDAY 

weekDayの型は、あるDaysofaWeek可能な値で初期化されるときに推論できます。一度weekDayとして宣言されるとDaysofaWeek、省略構文(.)を使用して、それを別のDaysofaWeekの値に設定できます:

var weekDay = .THURSDAY 

当weekDayの型が既知の場合、再度値を代入する際に列挙型名を省略できます。明示的な型の列挙値を使用すると、コードの可読性が向上します。

列挙型は関連値と元の値に分類できます。

関連値と元の値の違い

関連値 元の値
異なるデータ型 同じデータ型
例:enum {10,0.8,"Hello"} 例:enum {10,35,50}
値の作成は定数または変数に基づく 事前に設定された値
関連値は、列挙メンバーに基づいて新しい定数または変数を作成するときにのみ設定され、そのたびに値が異なる場合があります。 元の値は常に同じです

関連値

以下の例では、Student という名前の列挙型を定義します。これは Name の文字列(String)、または Mark の関連値(Int、Int、Int)にすることができます。

import Cocoa

enum Student{
    case Name(String)
    case Mark(Int,Int,Int)
}
var studDetails = Student.Name("サンプル")
var studMarks = Student.Mark(98,97,95)
switch studMarks {
case .Name(let studName):
    print("学生的名字是: \(studName)。")
case .Mark(let Mark1, let Mark2, let Mark3):
    print("学生的成绩是: \(Mark1),\(Mark2),\(Mark3)。")
}

上記のプログラムを実行すると、出力結果は次のようになります:

学生的成绩是: 98,97,95。

元の値

元の値は、文字列、文字、または任意の整数値または浮動小数点値にすることができます。各元の値は、その列挙型の宣言内で一意である必要があります。

元の値が整数の列挙型の場合、各メンバーに明示的に値を代入する必要はありません。Swift が自動的に値を代入します。

例えば、整数を元の値として使用する場合、暗黙的に代入される値は順に1ずつ増加します。最初の値に初期値が設定されていない場合、自動的に0に設定されます。

import Cocoa

enum Month: Int {
    case January = 1, February, March, April, May, June, July, August, September, October, November, December
}

let yearMonth = Month.May.rawValue
print("数字月份为: \(yearMonth)。")

上記のプログラムを実行すると、出力結果は次のようになります:

数字月份为: 5。
その他の拡張