iOS Swift基礎学習ノート(四)列挙(Enumeration)と構造体(Structure)

4798 ワード

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

練習:元の値(raw value)を比較することによって2つのRankの値を比較する関数を作成します.
func compareRank(rank1: Rank, rank2: Rank) -> Bool {
    return rank1.rawValue == rank2.rawValue
}
compareRank(rank1: Rank.ace, rank2: Rank.jack)

デフォルトでは、Swiftの元の値の割り当ては0から始まり、後に1を追加するたびに、デフォルト値を明示的に指定して変更することができます.上記の例では、列挙元の値(raw value)タイプはIntなので、最初の元の値を指定するだけです.その後の元の値は順番に割り当てられます.列挙元の値として文字列または浮動小数点数を使用することもできます.init( rawValue: )コンストラクタを使用して、元の値(raw value)を列挙値(enumeration value)に変換できます.
if let convertedRank = Rank.init(rawValue: 1) {
    let threeDescription = convertedRank.simpleDescription()
    
}
Rank(rawValue: 3)
Rank.init(rawValue: 50)

列挙されたメンバー値は実際の値であり、元の値の別の記述ではありません.実際には、元の値を提供することに実際の意味がない場合は、提供しなくてもいいです.
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に追加し、spadesとclubsが「black」を返し、heartsとdiamondsが「red」を返す.
    func color() -> String {
        switch self {
        case .spades, .clubs:
            return "black"
        case .hearts, .diamonds:
            return "red"
        }
    }
heartsメンバーを参照する2つの方法に注意してください.hearts定数に値を割り当てると、列挙メンバーSuit.heartsは定数が明示的に宣言されていないため、フルネームで参照されます.switchでは、.heartsの値が既知であるため、列挙はselfによって参照される.この略語は、値タイプが既知である場合に使用できます.
1つの列挙に元の値がある場合、これらの値は宣言の一部として決定され、各特定の列挙インスタンスが同じ元の値を持っていることを意味する.列挙の別の選択肢は、列挙メンバーのインスタンスがインスタンスに対応する関連値(associated value)を持つことです.同じ列挙メンバーのインスタンスには、異なる関連値が対応しています.インスタンスの作成時に関連値を指定します.関連値(associated value)と元の値(raw value)の違い:同じ列挙メンバーのすべてのインスタンスの元の値が同じで、列挙を定義するときに元の値を指定します.関連する値は、列挙インスタンスのストレージ属性と類似していると見なすことができます.たとえば、サーバから日の出と日没時間を要求する場合です.サーバは、要求された情報に応答するか、誤った記述情報に応答します.
enum ServerResponse {
    case result(String, String)
    case failure(String)
}

let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")

switch success {
case let .result(sunrise, sunset):
    print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message):
    print("Failure... \(message)")
}

練習:ServerResponseswitchに第3の状況を加える
enum ServerResponse {
    case result(String, String)
    case failure(String)
    case networkLost(String)
}

let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")
let networkLost = ServerResponse.networkLost("networkLost")

switch success {
case let .result(sunrise, sunset):
    print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message):
    print("Failure... \(message)")
case let .networkLost(networkMessage):
    print("Network... \(networkMessage)")
}

日の出と日没の時間がServerResponseの値とswitch部分からどのように一致するかに注意してください.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()

練習:Cardに方法を追加して、カードのセットを作成します.各カードは色と大きさの組み合わせです.
 func fullCard(spades: Int, hearts: Int, diamonds: Int, clubs: Int) -> String {
        return "The full card has \(spades) of spades, \(hearts) of hearts, \(diamonds) of diamonds and \(clubs) clubs."
    }