A Swift Tourその4– Enumerations and Structures
Swiftの言語仕様である「The Swift Programming Language」に沿って、学んでいきます。
Enumerations and Structures / 列挙型と構造体
列挙型には 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.toRaw()) } } } let ace = Rank.Ace let aceRawValue = ace.toRaw() // 1
列挙型のメンバだけでもよく、raw valuesは必ずしも必要ありません。
raw valuesというのは、上のコードの例でいうと、Rank.Ace がもっている 1 という値のことです。次の Rank.Two は 2 です。1ずつ増えていきます。
toRaw() メソッドを使ってアクセスできます。
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()
列挙型のメンバーである Hearts にアクセスする方法は2つあります。
定数 hearts に値を代入するときのように型(ここでは Suit)がわからないときは、Suit.Hearts というフルネームを使用します。
switch文の中では self は Suit型だと分かっているで、.Hearts と略して参照することができます。
構造体には strcut を使用します。
構造体はメソッドやイニシャライザといった、クラスと同じ振る舞いをします。
構造体とクラスのもっとも大きな違いは、構造体は代入すると実体がコピーされるのに対し、クラスは参照されるだけです。
オブジェクト指向言語では、より純粋なオブジェクト指向を目指して削除されてクラスで代用することも多いのですが、Objective−Cとの互換性を考慮したのでしょうね。
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() // "The 3 of spades"
列挙型のメンバーはインスンタンスと関連づけられた値(associated value)を持ちます。同じ列挙型のメンバーでも違うassocieted valueを持つことがあります。
raw valueに似ているのですが、raw valueは列挙型を定義するときに指定され、同じメンバーであればインスタンスが違っても同じ値になります。
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): let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)." // "Sunrise is at 6:00 am and sunset is at 8:09 pm." case let .Error(error): let serverResponse = "Failure... \(error)" }
上記の例では、ServerResponse型のインスタンスから sunrise と sunset の値を抽出しています。
「A Swfit Tourその5」に続きます。
「The Swift Programming Language」で使用されているコードはplaygroundとしてダウンロードして、XCodeで開くことができます。
https://developer.apple.com/library/ios/swift_tour