加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift4.2语言规范(二十一) 嵌套类型

发布时间:2020-12-14 05:11:32 所属栏目:百科 来源:网络整理
导读:通常创建枚举以支持特定类或结构的功能。 类似地,定义纯粹在更复杂类型的上下文中使用的实用程序类和结构可能是方便的。 为此,Swift允许您定义 嵌套类型 ,从而在它们支持的类型的定义中嵌套支持枚举,类和结构。 要将类型嵌套在另一个类型中,请在其支持

通常创建枚举以支持特定类或结构的功能。类似地,定义纯粹在更复杂类型的上下文中使用的实用程序类和结构可能是方便的。为此,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被保持故意短,因为它们的名称是自然的通过在它们所定义的上下文。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读