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

鍍金池/ 教程/ iOS/ 嵌套類型
特性(Attributes)
Access Control 權(quán)限控制的黑與白
基本運(yùn)算符(Basic Operators)
基礎(chǔ)部分(The Basics)
閉包(Closures)
擴(kuò)展
泛型參數(shù)(Generic Parameters and Arguments)
訪問控制和 protected
語句(Statements)
模式(Patterns)
WWDC 里面的那個(gè)“大炮打氣球”
關(guān)于語言參考(About the Language Reference)
語法總結(jié)(Summary of the Grammar)
嵌套類型
類型(Types)
Swift 初見(A Swift Tour)
泛型
枚舉(Enumerations)
高級(jí)運(yùn)算符
繼承
析構(gòu)過程
關(guān)于 Swift(About Swift)
訪問控制
類和結(jié)構(gòu)體
內(nèi)存安全
Swift 與 C 語言指針友好合作
協(xié)議
屬性(Properties)
可選類型完美解決占位問題
錯(cuò)誤處理
字符串和字符(Strings and Characters)
聲明(Declarations)
自動(dòng)引用計(jì)數(shù)
Swift 里的值類型與引用類型
表達(dá)式(Expressions)
Swift 文檔修訂歷史
造個(gè)類型不是夢(mèng)-白話 Swift 類型創(chuàng)建
歡迎使用 Swift
詞法結(jié)構(gòu)(Lexical Structure)
集合類型(Collection Types)
下標(biāo)
方法(Methods)
可選鏈?zhǔn)秸{(diào)用
版本兼容性
類型轉(zhuǎn)換
構(gòu)造過程
The Swift Programming Language 中文版
函數(shù)(Functions)
Swift 教程
控制流(Control Flow)

嵌套類型


1.0 翻譯:Lin-H 校對(duì):shinyzhu

2.0 翻譯+校對(duì):SergioChan

2.1 校對(duì):shanks,2015-11-01

2.2 翻譯+校對(duì):SketchK 2016-05-16 3.0.1,shanks,2016-11-13

4.0 翻譯+校對(duì):EyreFree 2017-10-19

4.1 翻譯+校對(duì):mylittleswift

本頁包含內(nèi)容:

枚舉常被用于為特定類或結(jié)構(gòu)體實(shí)現(xiàn)某些功能。類似地,枚舉可以方便的定義工具類或結(jié)構(gòu)體,從而為某個(gè)復(fù)雜的類型所使用。為了實(shí)現(xiàn)這種功能,Swift 允許你定義嵌套類型,可以在支持的類型中定義嵌套的枚舉、類和結(jié)構(gòu)體。

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

嵌套類型實(shí)踐

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

BlackjackCard 中,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.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
    }
}

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

Rank 枚舉用來描述撲克牌從 Ace~10,以及 J、Q、K,這 13 種牌,并用一個(gè) Int 類型的原始值表示牌的面值。(這個(gè) Int 類型的原始值未用于 AceJ、QK4 種牌。)

如上所述,Rank 枚舉在內(nèi)部定義了一個(gè)嵌套結(jié)構(gòu)體 Values。結(jié)構(gòu)體 Values 中定義了兩個(gè)屬性,用于反映只有 Ace 有兩個(gè)數(shù)值,其余牌都只有一個(gè)數(shù)值:

  • first 的類型為 Int
  • second 的類型為 Int?,或者說“可選 Int

Rank 還定義了一個(gè)計(jì)算型屬性 values,它將會(huì)返回一個(gè) Values 結(jié)構(gòu)體的實(shí)例。這個(gè)計(jì)算型屬性會(huì)根據(jù)牌的面值,用適當(dāng)?shù)臄?shù)值去初始化 Values 實(shí)例。對(duì)于 J、Q、K、Ace 這四種牌,會(huì)使用特殊數(shù)值。對(duì)于數(shù)字面值的牌,使用枚舉實(shí)例的 Int 類型的原始值。

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

因?yàn)?BlackjackCard 是一個(gè)沒有自定義構(gòu)造器的結(jié)構(gòu)體,在結(jié)構(gòu)體的逐一成員構(gòu)造器中可知,結(jié)構(gòu)體有默認(rèn)的成員構(gòu)造器,所以你可以用默認(rèn)的構(gòu)造器去初始化新常量 theAceOfSpades

let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
print("theAceOfSpades: \(theAceOfSpades.description)")
// 打印 “theAceOfSpades: suit is ?, value is 1 or 11”

盡管 RankSuit 嵌套在 BlackjackCard 中,但它們的類型仍可從上下文中推斷出來,所以在初始化實(shí)例時(shí)能夠單獨(dú)通過成員名稱(.ace.spades)引用枚舉實(shí)例。在上面的例子中,description 屬性正確地反映了黑桃 A 牌具有 111 兩個(gè)值。

引用嵌套類型

在外部引用嵌套類型時(shí),在嵌套類型的類型名前加上其外部類型的類型名作為前綴:

let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
// 紅心符號(hào)為 “?”

對(duì)于上面這個(gè)例子,這樣可以使 Suit、RankValues 的名字盡可能的短,因?yàn)樗鼈兊拿挚梢杂啥x它們的上下文來限定。