Menu

Category

Archive

logo


The Swift Programming Language ~ Nested Types

2014-06-26 14:00:00 +0900
  • このエントリーをはてなブックマークに追加

iBooks にある "The Swift Programming Language" の勉強メモ。Objective-C と C を普段書いている自分から、ちょっと馴染みがないものを特にまとめておきます。目次は こちら

今回は、Nested Types に関して。

Nested Types

Enumeration は他のクラスや構造体をサポートする形で使われることが多いです。また、複雑なクラスを助ける形でヘルパークラスを定義するのも便利です。このため、Swift では、Nested Type というものを使用できます。

1. Nested Types の例

ブラックジャックの例を通してどのように Nested Type が使われるか見ていきます。

 1 struct BlackjackCard {
 2     
 3     // nested Suit enumeration
 4     enum Suit: Character {
 5         case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣"
 6     }
 7     
 8     // nested Rank enumeration
 9     enum Rank: Int {
10         case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten
11         case Jack, Queen, King, Ace
12         struct Values {
13             let first: Int, second: Int?
14         }
15         var values: Values {
16         switch self {
17         case .Ace:
18             return Values(first: 1, second: 11)
19         case .Jack, .Queen, .King:
20             return Values(first: 10, second: nil)
21         default:
22             return Values(first: self.toRaw(), second: nil)
23             }
24         }
25     }
26     
27     // BlackjackCard properties and methods
28     let rank: Rank, suit: Suit
29     var description: String {
30     var output = "suit is \(suit.toRaw()),"
31         output += " value is \(rank.values.first)"
32         if let second = rank.values.second {
33             output += " or \(second)"
34         }
35         return output
36     }
37 }

この BlackjackCard 構造体は 2 つの Nested Enumeration を持っています。1 つ目は、Suit。これはカードの柄の文字を返します。2 つ目の、Rank は少し複雑です。まずは、2 ~ 10 の場合には、その rowvalue を定義します。さらにこの Enumeration は、Value Nested 構造体を定義しています。これが、2 つのプロパティを持っており、これを返すための Computed プロパティも持っています。

上記で定義した BlackjackCard 構造体をこのように初期化・参照できます。

1 let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades)
2 println("theAceOfSpades: \(theAceOfSpades.description)")
3 // prints "theAceOfSpades: suit is ♠, value is 1 or 11"
4 
5 let heartsSymbol = BlackjackCard.Suit.Hearts.toRaw()
6 // heartsSymbol is "♡"

複雑なクラスがうまく整理できそうです。