嵌套类型

嵌套类型:在支持的类型中定义嵌套的枚举、类和结构体

要在一个类型中嵌套另一个类型,将嵌套类型的定义写在其外部类型的{}内,而且可以根据需要定义多级嵌套

嵌套类型实践

struct BlackjackCard {
    //嵌套的 Suit 枚举//牌的花色
    enum Suit: Character {
        case Spades = "块", Hearts = "心", Diamonds = "*", Clubs = "额"
    }
    //嵌套的 Rank 枚举
    enum Rank: Int {
        case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten
        case Jack, Queen, King, Ace
        struct Values {//用于反应Ace有两种值,而其他只有一个
            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.rawValue, second: nil)
            }
        }
    }
    // BlackjackCard 的属性和方法
    let rank: Rank, suit: Suit
    var description: String {
        var output = "suit is \(suit.rawValue),"
        output += " value is \(rank.values.first)"
        if let second = rank.values.second {
            output += " or \(second)"
        }
        return output
    }
}

BlackjackCard结构体有默认的成员构造器,可以用默认构造器去初始化常量:

/**
尽管Rank和Suit嵌套在BlackjackCard中,类型可以从上下文推断出来,
因此可以用`.Ace 和.Spades`引用枚举实例
*/
let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades)
print("theAceOfSpades: \(theAceOfSpades.description)")
// 打印 “theAceOfSpades: suit is ?, value is 1 or 11”

引用嵌套类型

当想要在外部引用嵌套类型时,在嵌套类型名前加外部类型的类型名作为前缀

let heartsSymbol = BlackjackCard.Suit.Hearts.rawValue
//红心符号