枚举定义了一个常用的具有相关性的一组数据,并在你的代码中以一个安全的方式使用它们。
如果你熟悉C语言,你就会知道,C语言中的枚举指定相关名称为一组整数值。在Swift中枚举更为灵活,不必为枚举的每个成员提供一个值。如果一个值(被称为“原始”的值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或者任何整数或浮点类型的值。
另外,枚举成员可以指定任何类型,每个成员都可以存储的不同的相关值,就像其他语言中使用集合或变体。你还可以定义一组通用的相关成员为一个枚举,每一种都有不同的一组与它相关的适当类型的值的一部分。
在Swift中枚举类型是最重要的类型。它采用了很多以前只有类才具有的特性,如计算性能,以提供有关枚举的当前值的更多信息,方法和实例方法提供的功能 相关的枚举表示的值传统上支持的许多功能。枚举也可以定义初始化,以提供一个初始成员值;可以在原有基础上扩展扩大它们的功能;并使用协议来提供标准功 能。
欲了解更多有关这些功能,请参见Properties, Methods, Initialization, Extensions, Protocols
1、枚举语法
使用枚举enum关键词并把他们的整个定义在一对大括号内:
1 2 3 |
enum SomeEnumeration { // enumeration definition goes here } |
下面是一个指南针的四个点一个例子:
1 2 3 4 5 6 |
enum CompassPoint { case North case South case East case West } |
在枚举中定义的值(如North,South,East和West)是枚举的成员值(或成员)。这个例子里case关键字表示成员值一条新的分支将被定义。
Note
不像C和Objective-C,Swift枚举成员在创建时不分配默认整数值。在上面的例子CompassPoints中North,South,Eath,West不等于隐含0,1,2和3,而是一种与CompassPoint明确被定义的类型却各不相同的值。
多个成员的值可以出现在一行上,用逗号分隔:
1 2 3 |
enum Planet { case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune } |
每个枚举定义中定义了一个全新的类型。像其他Swift的类型,它们的名称(如CompassPoint和Planet)应为大写字母。给枚举类型单数而不是复数的名字,这样理解起来更加容易如:
1 |
var directionToHead = CompassPoint.West |
使用directionToHead的类型时,用CompassPoint的一个可能值初始化的推断。一旦directionToHead被声明为一个CompassPoint,您可以将其设置为使用更短的.语法而不用再书写枚举CompassPoint值本身:
1 |
directionToHead = .East |
directionToHead的类型是已知的,所以你可以在设定它的值时,不写该类型。使用类型明确的枚举值可以让代码具有更好的可读性。
2、匹配枚举值与switch语句
你可以使用单个枚举值匹配switch语句:
1 2 3 4 5 6 7 8 9 10 11 12 |
directionToHead = .South switch directionToHead { case .North: println("Lots of planets have a north") case .South: println("Watch out for penguins") case .East: println("Where the sun rises") case .West: println("Where the skies are blue") } // prints "Watch out for penguins" |
你可以理解这段代码:
“考虑directionToHead的价值。当它等于North,打印“Lots of planets have a north”。当它等于South,打印“Watch out for penguins”等等。
正如控制流所描述,Switch语句考虑枚举的成员,如果省略了West时,这段代码无法编译,因为它没有考虑CompassPoint成员的完整性。Switch语句要求全面性确保枚举成员,避免不小心漏掉情况发生。
当它不需要为每一个枚举成员都匹配的情况下,你可以提供一个默认default分支来涵盖未明确提到的任何成员:
1 2 3 4 5 6 7 8 |
let somePlanet = Planet.Earth switch somePlanet { case .Earth: println("Mostly harmless") default: println("Not a safe place for humans") } // prints "Mostly harmless" |
3、关联值
在上一节中的示例延时了一个枚举的成员是如何被定义(分类)的。你可以为Planet.Earth设置一个常量或变量,然后在代码中检查这个值。但 是,它有时是有用的才能存储其它类型的关联值除了这些成员的值。这让你随着成员值存储额外的自定义信息,并允许在你的代码中来使用该信息。
Swift的枚举类型可以由一些数据类型相关的组成,如果需要的话,这些数据类型可以是各不相同的。枚举的这种特性跟其它语言中的奇异集合,标签集合或者变体相似
例如,假设一个库存跟踪系统需要由两种不同类型的条形码来跟踪产品。有些产品上标有UPC-A代码格式,它使用数字0到9的一维条码,每一个条码都有一个“数字系统”的数字,后跟十“标识符”的数字。最后一位是“检查”位,以验证代码已被正确扫描:
其他产品都贴有二维条码QR码格式,它可以使用任何的ISO8859-1字符,并可以编码字符串,最多2,953个字符:
这将是方便的库存跟踪系统能够存储UPC-A条码作为三个整数的元组,和QR代码的条形码的任何长度的字符串。
在Swift中可以使用一个枚举来定义两种类型的产品条形码,结构可以是这样的:
1 2 3 4 |
enum Barcode { case UPCA(Int, Int, Int) case QRCode(String) } |
这可以被理解为:
“定义一个名为条形码枚举类型,它可以是UPC-A的任一值类型的关联值(Int,Int,Int),或QRCode的一个类型为String的关联值。”
这个定义不提供任何实际的Int或String值,它只是定义了条形码常量和变量当等于Barcode.UPCA或Barcode.QRCode关联值的类型的时候的存储形式。
然后可以使用任何一种类型来创建新的条码:
1 |
var productBarcode = Barcode.UPCA(8, 85909_51226, 3) |
此示例创建一个名为productBarcode新的变量,并与相关联的元组值赋给它Barcode.UPCA的值(8,8590951226,3)。提供的“标识符”值都有整数加下划线的文字,85909_51226,使其更易于阅读的条形码。
同一产品可以分配不同类型的条形码:
1 |
productBarcode = .QRCode("ABCDEFGHIJKLMNOP") |
在这一点上,原来Barcode.UPCA和其整数值被新的Barcode.QRCode及其字符串值代替。_条形码的常量和变量可以存储任何一个_UPCA或QRCode的(连同其关联值),但它们只能存储其中之一在任何指定时间。
不同的条码类型像以前一样可以使用一个switch语句来检查,但是这一次相关的值可以被提取作为switch语句的一部分。您提取每个相关值作为常数(let前缀)或变量(var前缀)不同的情况下,在switch语句的case代码内使用:
1 2 3 4 5 6 7 |
switch productBarcode { case .UPCA(let numberSystem, let identifier, let check): println("UPC-A with value of \(numberSystem), \(identifier), \(check).") case .QRCode(let productCode): println("QR code with value of \(productCode).") } // prints "QR code with value of ABCDEFGHIJKLMNOP." |
如果所有的枚举成员的关联值的提取为常数,或者当所有被提取为变量,为了简洁起见,可以放置一个var,或let标注在成员名称前:
1 2 3 4 5 6 7 |
switch productBarcode { case let .UPCA(numberSystem, identifier, check): println("UPC-A with value of \(numberSystem), \(identifier), \(check).") case let .QRCode(productCode): println("QR code with value of \(productCode).") } // prints "QR code with value of ABCDEFGHIJKLMNOP." |
4、原始值
在关联值的条形码的例子演示了一个枚举的成员如何能声明它们存储不同类型的关联值。作为替代关联值,枚举成员可以拿出预先填入缺省值(称为原始值),从而具有相同的类型。
这里是一个存储原始的ASCII值命名枚举成员的一个例子:
1 2 3 4 5 |
enum ASCIIControlCharacter: Character { case Tab = "\t" case LineFeed = "\n" case CarriageReturn = "\r" } |
在这里,原始值被定义为字符类型的枚举叫做ASCIIControlCharacter,并设置了一些比较常见的ASCII控制字符。字符值的字符串和字符的描述。
注意,原始值是不相同关联值。原始值设置为预填充的值时,应先在你的代码中定义枚举,像上述三个ASCII码。对于一个特定的枚举成员的原始值始终是相同的。当你创建一个基于枚举的常量或变量的新成员的关联值设置,每次当你这样做的时候可以是不同的。
原始值可以是字符串,字符,或任何整数或浮点数类型。每个原始值必须在它的枚举中唯一声明。当整数被用于原始值,如果其他枚举成员没有值时,它们自动递增。
下面列举的是一个细化的早期Planet枚举,使用原始整数值来表示每个Planet的太阳系的顺序:
1 2 3 |
enum Planet: Int { case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune } |
自动递增意味着Planet.Venus具有2的原始值,依此类推。
访问其toRaw方法枚举成员的原始值:
1 2 |
let earthsOrder = Planet.Earth.toRaw() // earthsOrder is 3 |
使用枚举的fromRaw方法来试图找到一个特定的原始值枚举成员。这个例子识别Uranus的位置通过原始值为7:
1 2 |
let possiblePlanet = Planet.fromRaw(7) // possiblePlanet is of type Planet? and equals Planet.Uranus |
然而,并非所有可能的Int值都会找到一个匹配的星球。正因如此,该fromRaw方法返回一个可选的枚举成员。在上面的例子中,是possiblePlanet类型Planet?或“可选的Planet”。
如果你试图找到一个Planet为9的位置,通过fromRaw返回可选的Planet值将是无:
1 2 3 4 5 6 7 8 9 10 11 12 |
let positionToFind = 9 if let somePlanet = Planet.fromRaw(positionToFind) { switch somePlanet { case .Earth: println("Mostly harmless") default: println("Not a safe place for humans") } } else { println("There isn't a planet at position \(positionToFind)") } // prints "There isn't a planet at position 9" |
这个范例使用somePlanet= Planet.fromRaw(9)来尝试访问可选集合Planet,在可选Planet集合中设置检索条件somePlanet,在原始值为9的情况下,不能检索到位置为9的星球,所有else分支被执行。
来自letsswift.com,微价值兄弟网站,欢迎访问。
感谢翻译小组成员:李起攀(微博)、若晨(微博)、YAO、粽子、山有木兮木有枝、渺-Bessie、墨离、矮人王、CXH、Tiger大顾(微博)
个人转载请注明出处,商业转载请联系我们~ 感谢您对我们工作的支持~
相关推荐
苹果Swift语言入门教程中文版是非常经典的教程,为初学者学习Swift编程语言提供了很好的指导。Swift是苹果公司为iOS和OSX应用开发推出的新编程语言,于2014年发布。该语言基于C和Objective-C编程语言,但并未保留C的...
Swift是苹果公司在2014年WWDC(全球开发者大会)上推出的一种全新编程语言,设计用于开发iOS和macOS应用程序。它是基于C和Objective-C,但摒弃了C的一些兼容性约束,以提供更安全、现代和有趣的编程体验。Swift采用...
【Swift语言介绍】 Swift是由Apple开发的一种新型编程语言,它被设计用来编写iOS和macOS应用程序。Swift在2014年的WWDC(Worldwide Developers Conference)上首次亮相,是与iOS 8一同推出的,目的是为了提升开发者...
【Swift语言介绍】 Swift是由Apple开发的一种新型编程语言,它被设计用来编写iOS和macOS应用程序。Swift在2014年的WWDC(Worldwide Developers Conference)上首次亮相,伴随着iOS 8一起发布。Swift的设计目标是...
Swift语言的特点包括: 1. **目的明确**:Swift专为iOS和OS X平台而设计,与苹果的成熟框架Cocoa和Cocoa Touch紧密结合。 2. **强大且易用**:Swift吸收了C和Objective-C的优点,比如面向对象特性,同时引入了更...
### 苹果Swift编程语言入门教程知识点概览 #### 1. 简介 - **Swift背景**:Swift是一种全新的编程语言,专为iOS和OS X应用开发设计。它继承了C和Objective-C的优点,但摆脱了一些C语言的限制,如指针运算等低级特性...
Swift 5.1 是苹果公司推出的编程语言Swift的第五个主要版本,它是为iOS、iPadOS、macOS、watchOS和tvOS等平台开发应用程序的重要工具。本教程将深入探讨Swift 5.1的主要特性、语法改进以及API更新,帮助开发者更高效...
Swift语言是由苹果公司开发的编程语言,自2014年首次推出以来,一直是苹果开发者生态系统的核心工具之一。本教程为全中文教程,基于Xcode 6.1版本,介绍了Swift的全部最新语法,覆盖了Swift编程语言的基础知识、特性...
本教程为“苹果Swift编程语言入门教程-中文完整版”,适合初学者学习Swift的基础知识和实践技巧。 Swift的特点包括简洁的语法、类型安全、互动性以及对现代编程概念的支持,如可选类型、闭包和泛型。以下是一些主要...
在提供的压缩包文件中,“Swift语言快速入门第八章.pdf”和“Swift语言快速入门第七章.pdf”很可能是教程的逐章节内容,涵盖了上述部分或全部知识点。而“大学霸淘宝店.url”可能是一个链接,指向一个在线商店,可能...
### 苹果Swift编程语言入门教程知识点概览 #### 1. 简介 - **Swift编程语言**: Swift是一种由苹果公司开发的全新编程语言,专为iOS和macOS应用设计。它汲取了C和Objective-C的优点,同时避免了一些传统C语言的限制...
Swift是由苹果公司开发的一种强类型、编译型、面向对象和函数式的编程语言,主要应用于iOS、macOS、watchOS和tvOS应用开发。Swift的设计目标是安全、高效和现代,旨在使编程更加简单和有趣。 #### 2. Swift基本语法...
该课程包含12个课程,旨在为初学者提供全面的Swift语言基础知识。虽然具体课程内容未知,但可以根据常见的Swift入门课程内容推测,这些课程可能涵盖以下知识点: #### 1. Swift 基础语法 - 变量和常量:如何声明和...
Swift语言的教程通过一系列编程示例来帮助初学者入门,并鼓励读者在Xcode中使用代码预览功能来加深理解。 Swift是一个面向未来的编程语言,它不仅适合用来编写小型的应用程序如“hello,world”,而且也能用来开发...
Swift语言是苹果公司于2014年推出的一种面向对象的编程语言,旨在为iOS、macOS、watchOS和tvOS等平台的开发提供更高效、简洁和安全的编程体验。本快速入门教程将帮助初学者掌握Swift的基础知识,逐步进阶到高级编程...
至于“苹果Swift编程语言入门教程.doc”文档,它很可能是对Swift基础知识的详细讲解,包括基本数据类型、控制流、函数、类和结构体、枚举、协议、错误处理、泛型等内容。此外,还可能涵盖了Swift中的最新特性,如...
### Swift编程语言中文教程知识点概览 #### 一、Swift编程语言简介 - **Swift**是一门由苹果公司推出的编程语言,专为开发iOS和macOS应用而设计。该语言结合了C和Objective-C的优点,但又去除了后者的一些限制,如...