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
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 "♡"

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