枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,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
的中内容来构建对这张扑克牌名字和数值的描述,并用可选类型second
来检查是否存在第二个值,若存在,则在原有的描述中增加对第二数值的描述。
因为BlackjackCard
是一个没有自定义构造函数的结构体,在Memberwise Initializers for Structure Types中知道结构体有默认的成员构造函数,所以你可以用默认的initializer
去初始化新的常量theAceOfSpades
:
let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades) println("theAceOfSpades: \(theAceOfSpades.description)") // 打印出 "theAceOfSpades: suit is ♠, value is 1 or 11"
尽管Rank
和Suit
嵌套在BlackjackCard
中,但仍可被引用,所以在初始化实例时能够通过枚举类型中的成员名称单独引用。在上面的例子中description
属性能正确得输出对Ace
牌有1和11两个值。
类型嵌套的引用
在外部对嵌套类型的引用,以被嵌套类型的名字为前缀,加上所要引用的属性名:
let heartsSymbol = BlackjackCard.Suit.Hearts.toRaw() // 红心的符号 为 "♡"
对于上面这个例子,这样可以使Suit
, Rank
, 和 Values
的名字尽可能的短,因为它们的名字会自然的由被定义的上下文来限定。
本文部分原文来自于http://www.swiftguide.cn/翻译小组的译文,共同校对中。
感谢翻译小组成员:李起攀(微博)、若晨(微博)、YAO、粽子、山有木兮木有枝、渺-Bessie、墨离、矮人王、CXH、Tiger大顾(微博)
相关推荐
### Swift中文教程知识点详解 #### 一、Swift简介与特性 **1.1 关于Swift** Swift 是一种高性能、安全且易于学习的编程语言,由苹果公司在2014年首次发布。它专为iOS、iPadOS、macOS、watchOS 和 tvOS 开发而设计...
本教程为全中文教程,基于Xcode 6.1版本,介绍了Swift的全部最新语法,覆盖了Swift编程语言的基础知识、特性、开发历史以及高级主题。 在Swift语言中,包含了多个重要的概念和特性。例如,它支持基本运算符如加、减...
类型嵌套允许你在一个类型中嵌套定义另一个类型,这在处理复杂数据结构时特别有用。扩展(Extension)是Swift中一种强大的功能,它允许你在不改变原有代码的情况下为现有的类、结构体、枚举或协议添加新的功能。最后...
### Swift中文版教程知识点概述 #### 一、Swift简介与基本概念 - **Swift语言**是一种用于开发苹果设备(如iPhone、iPad等)的应用程序的编程语言,它结合了C和Objective-C的优点,并在此基础上进行了大量的改进和...
Swift的闭包有多种类型,包括全局函数、嵌套函数和闭包表达式。 Swift是被设计为一门现代语言,它的标准库包含了许多有用的模块和数据类型,如字符串(String)和数字(Int、Double、Float、Bool等)。这些类型都经过...
Swift中文教程是一个专门为中文学习者设计的资源,旨在帮助他们理解和掌握Apple的Swift编程语言。Swift是由Apple在2014年推出的,用于开发iOS、iPadOS、macOS、watchOS和tvOS应用程序。它的设计目标是简洁、易读、...
《The Swift Programming Language中文完整版》是苹果公司为了介绍其新开发的编程语言Swift而编写的官方文档,内容全面、权威,并以中文形式提供给全球开发者。该文档由触控科技整理,并在CocoaChina社区中进行校对...
### Swift入门教程——基本语法概览 #### 一、Swift简介与环境搭建 Swift 是一种高性能、安全且易于学习的编程语言,适用于开发 macOS、iOS、watchOS 和 tvOS 应用程序。它由 Apple 设计,旨在为开发者提供一个更...
2. Swift教程章节:从基础开始,包括基本运算符、字符串和字符处理、集合类型、控制流、函数、闭包、枚举、类和结构体、属性、方法、下标、继承、初始化、析构、自动引用计数(ARC)、可选链式调用等。 3. 语言参考...
《The Swift Programming Language中文版.pdf》是一本由触控科技和CocoaChina整理精校的Swift编程语言官方电子书籍,其内容涵盖了Swift语言的全方位介绍,包括基础知识、进阶教程、各种特性和应用场景。这本书仅供...
- 类型嵌套:可以在一个类或结构体内部定义另一个类型。 Swift语言的高级特性包括: - 自判断链接(Safe Navigation Operator):在访问属性、方法或子脚本前,如果对象是nil,不会触发运行时错误。 - 类型转换:...
- **第2章 Swift教程**:提供了一个全面的Swift教程,涵盖了从基础知识到高级主题的各种内容。 - **第3章 语言参考**:深入探讨了Swift语言的具体细节,包括语法、类型系统等方面。 - **第4章 苹果官方Blog官方翻译*...