[翻译]Swift编程语言—— 嵌套的类型

[翻译]Swift编程语言—— 嵌套的类型,第1张

概述嵌套的类型 枚举经常被创建用来支撑特定类或者结构体的功能。类似的,为了在一个复合类型上下文中使用,定义纯粹的工具类和结构体也是可行的。为了做到这些,Swift允许定义嵌套类型,籍此可以在支持的类型定义中嵌套枚举、类、和结构体。 要把一个类型嵌套在另一个类型中,在那个类型的最外层大括号内定义类型就可以了。类型嵌套可以根据需要做任意层级的。 嵌套的类型实战 下面例子定义一个叫做BlackjackCar 嵌套的类型

枚举经常被创建用来支撑特定类或者结构体的功能。类似的,为了在一个复合类型上下文中使用,定义纯粹的工具类和结构体也是可行的。为了做到这些,Swift允许定义嵌套类型,籍此可以在支持的类型定义中嵌套枚举、类、和结构体。

要把一个类型嵌套在另一个类型中,在那个类型的最外层大括号内定义类型就可以了。类型嵌套可以根据需要做任意层级的。

嵌套的类型实战

下面例子定义一个叫做BlackjackCard(译者注:扑克牌21点游戏)的结构体,它模拟了游戏21点使用的纸牌。BlackjackCard结构体包括两个嵌套枚举类型,分别叫做Suit和Rank。

在21点游戏中,纸牌A(译者注:纸牌A的全称是Ace,在21点游戏中是号牌,拿到此牌的玩家可以根据需要确定它的分值是1或者是11)的值或者是1或者是11。这个特性通过一个叫做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枚举描述了可能的13张牌的顺序,连同一个初始的Int值表示它们(顺序)的面值。(这个初始的Int值不适用于J(Jack)、Q(Queen)、K(King)和A(Ace))

像上面叙述的一样,Rank枚举定义了属于它自己的嵌套结构体叫做Values。这个结构体封装了这样一个现象:多数的纸牌只有一个值,但是A会有两个。Values结构定义了两个属性来表现这些:
first,是一个Int类型
second,是一个Int?(或者“可选Int”)

Rank还定义了一个计算属性,叫做values,它返回一个Values结构体的实例。这个计算属性根据纸牌的排序位置构造一个与排序位置对应的新的Values实例。对于Jack、Queen、King和Ace采用特殊值,对于数字牌,使用排序的初始Int值。

BlackjackCard结构体自身有两个属性——rank和suit。同时还有一个计算属性叫做description,这个计算属性使用rank和suit中存储的值创建一个针对这张牌的名字和值的描述信息。description属性使用可选绑定来检查是不是有第二个值需要显示,如果有,会将第二个值插入到描述信息中去。

因为BlackjackCard是一个没有自定义构造方法的结构体,所以它拥有一个隐式的成员构造方法,就像 结构体类型的成员构造方法(Memberwise Initializers for Structure Type) 一节描述的一样。可以用这个构造方法初始化一个新的叫做theAceOfSpades的常量:

​let​ ​theAceOfSpades​ = ​BlackjackCard​(​rank​: .​Ace​,​suit​: .​Spades​)​println​(​"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的名字简短,因为它们的名字自然和定义的上下文一致。

总结

以上是内存溢出为你收集整理的[翻译]Swift编程语言—— 嵌套的类型全部内容,希望文章能够帮你解决[翻译]Swift编程语言—— 嵌套的类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1087142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存