A Swift Tourその4– Enumerations and Structures

LINEで送る
Pocket

Swiftの言語仕様である「The Swift Programming Language」に沿って、学んでいきます。

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型のインスタンスから sunrisesunset の値を抽出しています。

「A Swfit Tourその5」に続きます。

「The Swift Programming Language」で使用されているコードはplaygroundとしてダウンロードして、XCodeで開くことができます。
https://developer.apple.com/library/ios/swift_tour

LINEで送る
Pocket

コメントを残す