Swift4.2語言指南(二十一) 嵌套類型
通常創建枚舉以支持特定類或結構的功能。類似地,定義純粹在更復雜類型的上下文中使用的實用程序類和結構可能是方便的。為此,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, ten11 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
根據其等級使用適當的值初始化新實例。它采用特殊值jack
,queen
,king
,和ace
。對於數字卡,它使用rank的原始Int
值。
該BlackjackCard
結構本身有兩個屬性- rank
和suit
。它還定義了一個名為的計算屬性description
,它使用存儲在其中的值rank
並suit
構建卡名稱和值的描述。該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
屬性正確地報告了黑桃王牌的值為1
或11
。
引用嵌套類型
要在其定義上下文之外使用嵌套類型,請在其名稱前面加上嵌套在其中的類型的名稱:
1 let heartsSymbol = BlackjackCard.Suit.hearts.rawValue 2 // heartsSymbol is "?"
對於上面的示例,這使得的名字Suit
,Rank
和Values
被保持故意短,因為它們的名稱是自然的通過在它們所定義的上下文。
Swift4.2語言指南(二十一) 嵌套類型