在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ iOS/ 嵌套類型
方法 - Methods
關(guān)于 Swift
下標(biāo)腳本(Subscripts)
類和結(jié)構(gòu)體
類型轉(zhuǎn)換(Type Casting)
控制流
析構(gòu)過程(Deinitialization)
集合類型 (Collection Types)
構(gòu)造過程(Initialization)
Optional Chaining
枚舉(Enumerations)
自動(dòng)引用計(jì)數(shù)
繼承(Inheritance)
擴(kuò)展(Extensions)
泛型
字符串和字符(Strings and Characters)
函數(shù)(Functions)
高級(jí)運(yùn)算符
訪問控制
基本運(yùn)算符
嵌套類型
閉包(Closures)
協(xié)議
屬性 (Properties)

嵌套類型

枚舉類型常被用于實(shí)現(xiàn)特定類或結(jié)構(gòu)體的功能。也能夠在有多種變量類型的環(huán)境中,方便地定義通用類或結(jié)構(gòu)體來使用,為了實(shí)現(xiàn)這種功能,Swift允許你定義嵌套類型,可以在枚舉類型、類和結(jié)構(gòu)體中定義支持嵌套的類型。

要在一個(gè)類型中嵌套另一個(gè)類型,將需要嵌套的類型的定義寫在被嵌套類型的區(qū)域{}內(nèi),而且可以根據(jù)需要定義多級(jí)嵌套。

嵌套類型實(shí)例

下面這個(gè)例子定義了一個(gè)結(jié)構(gòu)體BlackjackCard(二十一點(diǎn)),用來模擬BlackjackCard中的撲克牌點(diǎn)數(shù)。BlackjackCard結(jié)構(gòu)體包含2個(gè)嵌套定義的枚舉類型SuitRank。

BlackjackCard規(guī)則中,Ace牌可以表示1或者11,Ace牌的這一特征用一個(gè)嵌套在枚舉型Rank的結(jié)構(gòu)體Values來表示。

    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 {
                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 的屬性和方法
        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
        }
    }

枚舉型的Suit用來描述撲克牌的四種花色,并分別用一個(gè)Character類型的值代表花色符號(hào)。

枚舉型的Rank用來描述撲克牌從Ace~10,J,Q,K,13張牌,并分別用一個(gè)Int類型的值表示牌的面值。(這個(gè)Int類型的值不適用于Ace,J,Q,K的牌)。

如上文所提到的,枚舉型Rank在自己內(nèi)部定義了一個(gè)嵌套結(jié)構(gòu)體Values。這個(gè)結(jié)構(gòu)體包含兩個(gè)變量,只有Ace有兩個(gè)數(shù)值,其余牌都只有一個(gè)數(shù)值。結(jié)構(gòu)體Values中定義的兩個(gè)屬性:

first, 為Int second, 為 Int?, 或 “optional Int

Rank定義了一個(gè)計(jì)算屬性values,這個(gè)計(jì)算屬性會(huì)根據(jù)牌的面值,用適當(dāng)?shù)臄?shù)值去初始化Values實(shí)例,并賦值給values。對(duì)于J,Q,K,Ace會(huì)使用特殊數(shù)值,對(duì)于數(shù)字面值的牌使用Int類型的值。

BlackjackCard結(jié)構(gòu)體自身有兩個(gè)屬性—ranksuit,也同樣定義了一個(gè)計(jì)算屬性description,description屬性用ranksuit的中內(nèi)容來構(gòu)建對(duì)這張撲克牌名字和數(shù)值的描述,并用可選類型second來檢查是否存在第二個(gè)值,若存在,則在原有的描述中增加對(duì)第二數(shù)值的描述。

因?yàn)?code>BlackjackCard是一個(gè)沒有自定義構(gòu)造函數(shù)的結(jié)構(gòu)體,在Memberwise Initializers for Structure Types中知道結(jié)構(gòu)體有默認(rèn)的成員構(gòu)造函數(shù),所以你可以用默認(rèn)的initializer去初始化新的常量theAceOfSpades:

    let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades)
    println("theAceOfSpades: \(theAceOfSpades.description)")
    // 打印出 "theAceOfSpades: suit is ?, value is 1 or 11"

盡管RankSuit嵌套在BlackjackCard中,但仍可被引用,所以在初始化實(shí)例時(shí)能夠通過枚舉類型中的成員名稱單獨(dú)引用。在上面的例子中description屬性能正確得輸出對(duì)Ace牌有1和11兩個(gè)值。

嵌套類型的引用

在外部對(duì)嵌套類型的引用,以被嵌套類型的名字為前綴,加上所要引用的屬性名:

    let heartsSymbol = BlackjackCard.Suit.Hearts.toRaw()
    // 紅心的符號(hào) 為 "?"

對(duì)于上面這個(gè)例子,這樣可以使Suit, Rank, 和 Values的名字盡可能的短,因?yàn)樗鼈兊拿謺?huì)自然的由被定義的上下文來限定。