注册 登录
主题 : 从今天开始学习Swift -- 类型嵌套
级别: 精灵王

状态: 连续签到 - [5天]
UID: 169195
精华: 0
发帖: 823
可可豆: 612 CB
威望: 1273 点
在线时间: 2637(时)
注册时间: 2012-09-28
最后登录: 2017-08-21
0 楼:  发表于: 2014-06-05 15:03    发自: Web Page
来源于 Swift教程 分类

从今天开始学习Swift -- 类型嵌套   

Swift系列文章由CocoaChina翻译小组翻译自苹果的官方文档:The Swift Programming Language。本篇译者:ChildhoodAndy(Github主页),敬请勘误,欢迎在CocoaChina github主页参看更多文章!


枚举类型常被用于实现特定类或结构体的功能。同样地,也能够在有多种变量类型的环境中方便地定义通用类或结构体。为了实现这种功能,Swift允许你定义类型嵌套,可以在枚举类型、类和结构体中定义支持嵌套的类型。

要在一个类型中嵌套另一个类型,将需要嵌套的类型的定义写在被嵌套类型的区域{}内,而且可以根据需要定义多级嵌套。

类型嵌套实例
下面这个例子定义了一个结构体BlackjackCard,用来模拟BlackjackCard(游戏:二十一点)中的扑克牌点数。BlackjackCard结构体包含2个嵌套定义的枚举类型 Suit 和 Rank。

在BlackjackCard规则中,Ace牌可以表示1或者11,Ace牌的这一特征用一个嵌套在枚举型Rank中的结构体Values来表示。

struct BlackjackCard { 
 
    // 嵌套定义枚举型Suit 
    enum Suit: Character { 
       case Spades = "♠", Hearts = "?", Diamonds = "?", Clubs = "♣" 
   } 
 
    // 嵌套定义枚举型Rank 
    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.toRaw(), second: nil) 
            } 
       } 
    } 
 
    // BlackjackCard 的属性和方法 
    let rank: Rank, suit: Suit 
    var description: String { 
    var output = "suit is \(suit.toRaw())," 
       output += " value is \(rank.values.first)" 
        if let second = rank.values.second { 
            output += " or \(second)" 
        } 
        return output 
    } 
} 

枚举型的Suit用来描述扑克牌的四种花色,并分别用一个Character类型的值代表花色符号。

枚举型的Rank用来描述扑克牌从Ace~10,J,Q,K,13张牌,并分别用一个Int类型的值表示牌的面值(这个Int类型的值不适用于Ace,J,Q,K的牌)。

如上文所提到的,枚举型Rank在自己内部定义了一个嵌套结构体Values。这个结构体包含两个变量,只有Ace有两个数值,其余牌都只有一个数值。结构体Values中定义了两个属性:
first, 为Int ;
second, 为 Int?, 或 “optional Int”;

Rank还定义了一个计算属性values,这个计算属性会根据牌的面值,用适当的数值去初始化Values实例,并赋值给values。对于J,Q,K,Ace会使用特殊数值,对于数字面值的牌使用Int类型的值。

BlackjackCard结构体自身有两个属性—rank与suit,它还定义了一个计算属性description,description属性使用rank和suit中的内容来构建对这张扑克牌名字和数值的描述,并且使用可选类型来检查是否存在第二个值,若存在,则在原有的描述中增加对第二数值的描述。

因为BlackjackCard是一个没有自定义构造函数的结构体,正如《Memberwise Initializers for Structure Types》中所描述的,BlackjackCard结构体有默认的成员构造函数,所以你可以使用默认的initializer去初始化新的常量theAceOfSpades:


let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades) 
println("theAceOfSpades: \(theAceOfSpades.description)") 
// 打印出 "theAceOfSpades: suit is ♠, value is 1 or 11" 



尽管Rank和Suit嵌套在BlackjackCard中,但仍可被引用,所以在初始化实例时能够通过枚举类型中的成员名称(.Ace 和 .Spades)单独引用。在上面的例子中,description属性能正确地输出theAceOfSpades有1和11两个值。

类型嵌套的引用
在外部对嵌套类型的引用,是以被嵌套类型的名字为前缀,加上所要引用的属性名:



let heartsSymbol = BlackjackCard.Suit.Hearts.toRaw() 
 
// 红心的符号 为 "?" 


对于上面这个例子,这样做可以使Suit, Rank, 和 Values的名字尽可能的简短,因为它们的名字会自然地由被定义的上下文来限定。

CocoaChina是全球最大的苹果开发中文社区,官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及Cocos2d引擎、Cocostudio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态,微信在手,天下我有!
请搜索微信号“CocoaChina”关注我们!





清空我的评分动态本帖最近评分记录: 共2条评分记录
lyywhg 可可豆 +10 2014-06-05 -
阿花君霸占路人 可可豆 +5 2014-06-05 妞!GOOD JOB!
隐藏评分记录
搜索CocoaChina关注微信,每天推送各种最新资讯、活动。

级别: 风云使者

状态: 连续签到 - [480天]
UID: 78198
精华: 2
发帖: 3543
可可豆: 3376 CB
威望: 13237 点
在线时间: 4900(时)
注册时间: 2011-06-28
最后登录: 2017-10-23
1 楼:  发表于: 2014-06-06 09:26    发自: Web Page
      
微信whglyy
级别: 精灵王

状态: 连续签到 - [195天]
UID: 226653
精华: 0
发帖: 1963
可可豆: 4647 CB
威望: 4032 点
在线时间: 1140(时)
注册时间: 2013-06-04
最后登录: 2018-03-27
2 楼:  发表于: 2014-06-06 09:48    发自: Web Page
顶起~
I eat Apple !
级别: 精灵王

状态: 连续签到 - [99天]
UID: 109196
精华: 0
发帖: 748
可可豆: 984 CB
威望: 2184 点
在线时间: 409(时)
注册时间: 2011-12-01
最后登录: 2016-11-22
3 楼:  发表于: 2014-06-06 10:52    发自: Web Page

本站内容均为本站转发,已尽可能注明出处。因未能核实来源或转发内容图片有权利瑕疵的,请及时联系本站,本站会第一时间进行修改或删除。 QQ : 3442093904

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部