iBooks にある “The Swift Programming Language” の勉強メモ。Objective-C と C を普段書いている自分から、ちょっと馴染みがないものを特にまとめておきます。目次は こちら。
今回は、Nested Types に関して。
Nested Types
Enumeration は他のクラスや構造体をサポートする形で使われることが多いです。また、複雑なクラスを助ける形でヘルパークラスを定義するのも便利です。このため、Swift では、Nested Type というものを使用できます。
1. Nested Types の例
ブラックジャックの例を通してどのように Nested Type が使われるか見ていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | struct BlackjackCard { // nested Suit enumeration enum Suit: Character { case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣" } // nested Rank enumeration enum Rank: Int { case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten case Jack, Queen, King, Ace struct Values { let first: Int, second: Int? } var values: Values { switch self { case .Ace: return Values(first: 1, second: 11) case .Jack, .Queen, .King: return Values(first: 10, second: nil) default: return Values(first: self.toRaw(), second: nil) } } } // BlackjackCard properties and methods let rank: Rank, suit: Suit var description: String { var output = "suit is \(suit.toRaw())," output += " value is \(rank.values.first)" if let second = rank.values.second { output += " or \(second)" } return output } } |
この BlackjackCard 構造体は 2 つの Nested Enumeration を持っています。1 つ目は、Suit
。これはカードの柄の文字を返します。2 つ目の、Rank
は少し複雑です。まずは、2 ~ 10 の場合には、その rowvalue を定義します。さらにこの Enumeration は、Value Nested 構造体を定義しています。これが、2 つのプロパティを持っており、これを返すための Computed プロパティも持っています。
上記で定義した BlackjackCard 構造体をこのように初期化・参照できます。
1 2 3 4 5 6 | let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades) println("theAceOfSpades: \(theAceOfSpades.description)") // prints "theAceOfSpades: suit is ♠, value is 1 or 11" let heartsSymbol = BlackjackCard.Suit.Hearts.toRaw() // heartsSymbol is "♡" |
複雑なクラスがうまく整理できそうです。