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

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

嵌套類(lèi)型

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

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

嵌套類(lèi)型實(shí)例

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

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

    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用來(lái)描述撲克牌的四種花色,并分別用一個(gè)Character類(lèi)型的值代表花色符號(hào)。

枚舉型的Rank用來(lái)描述撲克牌從Ace~10,J,Q,K,13張牌,并分別用一個(gè)Int類(lèi)型的值表示牌的面值。(這個(gè)Int類(lèi)型的值不適用于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類(lèi)型的值。

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

因?yàn)?code>BlackjackCard是一個(gè)沒(méi)有自定義構(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í)能夠通過(guò)枚舉類(lèi)型中的成員名稱(chēng)單獨(dú)引用。在上面的例子中description屬性能正確得輸出對(duì)Ace牌有1和11兩個(gè)值。

嵌套類(lèi)型的引用

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

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

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