1. 程式人生 > >Swift4.2語言指南(二十一) 嵌套類型

Swift4.2語言指南(二十一) 嵌套類型

十一點 案例 價值 常量 clu second 指南 撲克牌 values

通常創建枚舉以支持特定類或結構的功能。類似地,定義純粹在更復雜類型的上下文中使用的實用程序類和結構可能是方便的。為此,Swift允許您定義嵌套類型,從而在它們支持的類型的定義中嵌套支持枚舉,類和結構。

要將類型嵌套在另一個類型中,請在其支持的類型的外括號內寫入其定義。類型可以嵌套到所需的級別。

Action中的嵌套類型

下面的示例定義了一個名為的結構BlackjackCard,它對二十一點遊戲中使用的撲克牌進行建模。BlackjackCard結構包含兩個名為Suit和的嵌套枚舉類型Rank

在二十一點中,Ace牌的價值為一或十一。此功能由一個名為的結構表示,該結構Values嵌套在

Rank枚舉中:

 1 struct BlackjackCard {
 2 
 3     // nested Suit enumeration
 4     enum Suit: Character {
 5         case spades = "", hearts = "?", diamonds = "?", clubs = ""
 6     }
 7 
 8     // nested Rank enumeration
 9     enum Rank: Int {
10         case two = 2, three, four, five, six, seven, eight, nine, ten
11 case jack, queen, king, ace 12 struct Values { 13 let first: Int, second: Int? 14 } 15 var values: Values { 16 switch self { 17 case .ace: 18 return Values(first: 1, second: 11) 19 case .jack, .queen, .king:
20 return Values(first: 10, second: nil) 21 default: 22 return Values(first: self.rawValue, second: nil) 23 } 24 } 25 } 26 27 // BlackjackCard properties and methods 28 let rank: Rank, suit: Suit 29 var description: String { 30 var output = "suit is \(suit.rawValue)," 31 output += " value is \(rank.values.first)" 32 if let second = rank.values.second { 33 output += " or \(second)" 34 } 35 return output 36 } 37 }

Suit枚舉描述了四種常見的撲克牌花色,與原料一起Character值來表示他們的象征。

Rank枚舉描述了十名三個可能撲克牌行列,與原料一起Int值來表示其面值。(此原始Int值不用於Jack,Queen,King和Ace卡。)

如上所述,Rank枚舉定義了自己的另一個嵌套結構,稱為Values這種結構封裝了大多數卡片都有一個值的事實,但Ace卡片有兩個值。Values結構定義了兩個屬性來表示:

  • first,類型 Int
  • second,類型Int?或“可選Int

Rank還定義了一個計算屬性,values它返回Values結構的一個實例此計算屬性考慮卡的等級,並Values根據其等級使用適當的值初始化新實例。它采用特殊值jackqueenking,和ace對於數字卡,它使用rank的原始Int值。

BlackjackCard結構本身有兩個屬性- ranksuit它還定義了一個名為的計算屬性description,它使用存儲在其中的值ranksuit構建卡名稱和值的描述。description屬性使用可選綁定來檢查是否存在要顯示的第二個值,如果是,則為該第二個值插入其他描述詳細信息。

因為BlackjackCard是沒有自定義初始值設定項的結構,所以它具有隱式成員初始值設定項,如結構類型的成員初始值設定項中所述您可以使用此初始化程序初始化一個名為的新常量theAceOfSpades

1 let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
2 print("theAceOfSpades: \(theAceOfSpades.description)")
3 // Prints "theAceOfSpades: suit is ♠, value is 1 or 11"

即使Rank並且Suit嵌套在其中BlackjackCard,也可以從上下文推斷出它們的類型,因此該實例的初始化能夠通過它們的案例名稱(.ace.spades)單獨引用枚舉案例在上面的示例中,description屬性正確地報告了黑桃王牌的值為111

引用嵌套類型

要在其定義上下文之外使用嵌套類型,請在其名稱前面加上嵌套在其中的類型的名稱:

1 let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
2 // heartsSymbol is "?"

對於上面的示例,這使得的名字SuitRankValues被保持故意短,因為它們的名稱是自然的通過在它們所定義的上下文。

Swift4.2語言指南(二十一) 嵌套類型