列挙型は enum
で定義します。クラスと同様に、列挙型もメソッドを持つことができます。
enum Rank: Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescription() -> String {
switch self {
case .Ace:
return "ace"
case .Jack:
return "jack"
case .Queen:
return "queen"
case .King:
return "king"
default:
return String(self.rawValue)
}
}
}
let ace = Rank.Ace
let aceRawValue = ace.rawValue
Rank
値を rawValue
で比較する関数を書いてみよう。
この例では、列挙型のデータ型が Int
であるため、始めの値だけを指定しています。残りは順に値が代入されます。列挙型のデータ型として文字列や小数を指定することも可能です。列挙型のデータ (raw value) には、rawValue
プロパティでアクセスします。
列挙型のインスタンスをデータ (raw value) から生成するには、init?(rawValue:)
イニシャライザを使用します。
if let convertedRank = Rank(rawValue: 3) {
let threeDescription = convertedRank.simpleDescription()
}
列挙型の case
値は、データ (raw value) を表現する手段であり、実際の値でもあります。意味のあるデータ (raw value) が無い場合には、データ (raw value) を省略します。
enum Suit {
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades:
return "spades"
case .Hearts:
return "hearts"
case .Diamonds:
return "diamonds"
case .Clubs:
return "clubs"
}
}
}
let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()
color()
メソッドを Suit
に追加してみよう。
上の例で、Hearts
を参照する方法が 2 種類あることに注目してください。定数 hearts
に値を代入するとき、Suit.Hearts
としてフルネームで参照しています。これは、定数に明示的な型が指定されていないためです。switch
のほうでは、省略された .Hearts
として参照していますが、self
の値が Suit
のインスタンスであることがわかっているためです。つまり、値の型がすでにわかっているため、省略できるということです。
構造体は struct
で定義します。構造体は、メソッドやイニシャライザを含めて、クラスと同じ振る舞いを多数サポートしています。構造体とクラスの最も重要な相違点は、構造体は常にコピーが渡され、クラスは参照が渡されるという点です。
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
rank
と suit
の組み合わせをひととおり揃えるメソッドを Card
に追加してみよう。
列挙型のインスタンスは、インスタンスに関連する値を持つことができ、同じ列挙型の複数インスタンスが、それぞれ異なる値を持つこともできます。インスタンス生成時に関連する値を渡します。関連する値 (associated value) とデータ (raw value) は異なります。列挙型の raw value は、列挙型の定義時に記述し、すべてのインスタンスで同じ値となります。
例として、サーバから日の出 (sunrise) と日の入 (sunset) の時刻が返されるリクエストを考えてみましょう。サーバは時刻の情報を返すか、エラーを返します。
enum ServerResponse {
case Result(String, String)
case Error(String)
}
let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.")
switch success {
case let .Result(sunrise, sunset):
print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .Error(error):
print("Failure... \(error)")
}
ServerResponse
と switch
に、3 つ目の case
を追加してみよう。
switch
の case
で、ServerResponse
の値から sunrise と sunset をどのように参照しているかに注目してください。
Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.