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)")
}
練習:
ServerResponse
とswitch
に第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."
}