★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9739741.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
通常创建枚举来支持特定类或结构的功能。类似地,纯粹定义实用程序类和结构以在更复杂的类型的上下文中使用可能很方便。为此,Swift使您能够定义嵌套类型,从而在它们支持的类型的定义内嵌套支持的枚举,类和结构。
要将一个类型嵌套在另一个类型中,请在其支持的类型的大括号内写入其定义。类型可以嵌套到所需的多个级别。
嵌套类型的作用
下面的示例定义了一个名为的结构BlackjackCard
,该结构可模拟二十一点游戏中使用的扑克牌。该BlackjackCard
结构包含两个嵌套的枚举类型,分别称为Suit
和Rank
。
在二十一点中,Ace卡的值是一或十一。此功能由称为的结构表示,该结构Values
嵌套在Rank
枚举内:
- struct BlackjackCard {
- // nested Suit enumeration
- enum Suit: Character {
- case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣"
- }
- // nested Rank enumeration
- 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 properties and methods
- 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
枚举描述了四种常见的扑克牌花色,与原料一起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
。对于数字卡,它使用等级的原始Int
值。
该BlackjackCard
结构本身有两个属性- rank
和suit
。它还定义了一个称为的计算属性description
,该属性使用存储在中的值rank
并suit
建立对卡名称和值的描述。该description
属性使用可选绑定来检查是否要显示第二个值,如果是,则为该第二个值插入其他描述详细信息。
因为BlackjackCard
是没有自定义初始化程序的结构,所以它有一个隐式的成员初始化程序,如“结构类型的Memberwise初始化程序”中所述。您可以使用此初始值设定项来初始化一个名为的新常量theAceOfSpades
:
- let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
- print("theAceOfSpades: (theAceOfSpades.description)")
- // Prints "theAceOfSpades: suit is ♠, value is 1 or 11"
即使Rank
和Suit
嵌套在其中BlackjackCard
,它们的类型也可以从上下文中推断出来,因此,此实例的初始化能够仅通过其案例名称(.ace
和.spades
)来引用枚举案例。在上面的示例中,该description
属性正确报告黑桃A的值为1
或11
。
引用嵌套类型
要在其定义上下文之外使用嵌套类型,请为其名称加上嵌套在其中的类型名称的前缀:
- let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
- // heartsSymbol is "♡"
对于上面的示例,这使得的名称Suit
,Rank
以及Values
要被故意保持短,因为它们的名称是天然通过在它们所定义的上下文合格。