枚举为一种相关值定义了一个通用类型,从而可以让你在代码中类型安全的操作这些值。

Swift中的枚举很灵活,不需要给每一个枚举中的成员都提供值。如果一个值(所谓 原时值) 要被提供给每一个枚举成员,那么这个值可以是字符串 字符 任意的整数值 或者浮点类型。

而且 枚举成员可以指定任意类型的值来与不痛的成员值关联。你可以定义一组相关成员的合集作为枚举的一部分,每一个成员都可以有不同类型的值的合集与其关联。

Swift 中的枚举是具有自己权限的一类类型。它们使用了许多一般只被类所支持的特性,例如计算属性用来提供关于枚举当前值的额外信息,并且实例方法用来提供与枚举表示的值相关的功能。枚举同样也能够定义初始化器来初始化成员值;而且能够遵循协议来提供标准功能。

枚举语法

使用enum关键字来定义一个枚举,然后将所有的定义内容放在一个大括号{}中

enum SomeEnumeration {
//枚举成员
}

指南针的四个主要方向的例子

enum CompassPoint {
case north
case south
case east
case west
}

在一个枚举中定义的值(比如: north, south, east和 west)就是枚举的成员值(或成员) case关键字则明确了要定义成员值。

注意:

不像 C 和 Objective-C 那样,Swift 的枚举成员在被创建时不会分配一个默认的整数值。在上文的 CompassPoint例子中, north, south, east和 west并不代表 0, 1, 2和 3。而相反,不同的枚举成员在它们自己的权限中都是完全合格的值,并且是一个在 CompassPoint中被显式定义的类型。

多个成员值可以出现在同一行中,要用逗号隔开

enum Planet {
case mercury,venus,earth, mars, jupiter, saturn, uranus, neptune
}

每个枚举都定义了一个全新的类型。正如 Swift 中其它的类型那样,它们的名称(例如: CompassPoint和 Planet)需要首字母大写。给枚举类型起一个单数的而不是复数的名字,从而使得它们能够顾名思义:

var directionToHead = CompassPoint.west

当与 CompassPoint中可用的某一值一同初始化时 directionToHead的类型会被推断出来。一旦 directionToHead以 CompassPoint类型被声明,你就可以用一个点语法把它设定成不同的 CompassPoint值:

directionToHead = .east

directionToHead的类型是已知的,所以当设定它的值时你可以不用写类型。这样做可以使得你在操作确定类型的枚举时让代码非常易读。

使用Switch语句来匹配枚举值

var directionToHead = CompassPoint.west
directionToHead = .east
switch directionToHead {
case .north:
print("北方")
case .south:
print("南方")
case .east:
print("东方")
default:
print("西方")
}

switch 语句应该是全覆盖的  如果 .west的 case被省略了,那么代码将不能编译,因为这时表明它并没有覆盖 CompassPoint的所有成员。要求覆盖所有枚举成员是因为这样可以保证枚举成员不会意外的被漏掉。

关联值

关联值是将额外信息附加到enum case 中的一种极好的方式,打个比方,你正在开发一款交易引擎,可能存在买和卖两种不同的交易类型。除此之外每手交易还需要指定明确的股票名和交易数量:

enum Trade {
case Buy
case Sell
}
func trade(tradeType:Trade,stock:String,amount:Int){ }

然而股票的价值和数量显然从属于交易,让他们作为毒瘤的参数显得模棱两可。这个时候枚举的关联值就可以很好的解决这个问题

enum Trade {
case Buy(stock:String,amount:Int)
case Sell(stock:String,amount:Int)
}
func trade(tradeType:Trade){ }
enum Trade {
case Buy(stock:String,amount:Int)
case Sell(stock:String,amount:Int)
}
func createTrad(stockName:String,stockCount:Int) ->Trade { if stockCount > {
return .Buy(stock: stockName, amount: stockCount)
}else {
return .Sell(stock: stockName, amount: stockCount)
}
} let result = createTrad(stockName: "腾讯", stockCount: )
switch result { case let .Buy(stockName,stockCount):
print("\(stockName) and \(stockCount)")
case let .Sell(stockName,stockCount):
print("\(stockName) and \(stockCount)")
} //关联值 也可以有多个
enum Barcode {
case UPCA(chang:Int,kuan:Int,gao:Int)
case QRcode(String)
} func createQRcode(first:Int,second:Int,Third:Int,Info:String)->Barcode {
if first < second && Third > second {
return .UPCA(chang: first, kuan: second, gao: Third)
}else {
return .QRcode(Info)
}
}

原始值

为每一个枚举的成员分配一个原始值

enum Movement:Int{
case Left =
case Right =
case Top =
case Bottom =
} //同样你可以与字符串一一对应
enum House:String {
case Baratheon = "Ours is the Fury"
case Greyjoy = "We Do Not Sow"
case Martell = "Unbowed, Unbent, Unbroken"
case Stark = "Winter is Coming"
case Tully = "Family, Duty, Honor"
case Tyrell = "Growing Strong"
}
// 或者float double都可以(同时注意枚举中的花式unicode)
enum Constants: Double {
case π = 3.14159
case e = 2.71828
case φ = 1.61803398874
case λ = 1.30357
}

隐式指定的原始值

对于String和Int类型来说,你甚至可以忽略枚举中的case赋值,Swift编译器也能正常工作

enum Planent:Int {
case Mercury = ,venus,Earth,Mars, Jupiter, Saturn, Uranus, Neptune
}
//对于绑定原始值为字符串类型的来说 如果没有明确写出 默认原始值是本身
enum CompassPointSecond:String {
case North,South,East,West
} var plaent = Planent.Mars
plaent.rawValue//
var point = CompassPointSecond.South
point.rawValue//"South"

从原始值初始化

//这样获取的是可选值 使用的时候注意解包
let plaent = Planent(rawValue:)// .Earth
if let plaent = plaent {
plaent.rawValue//
}
let point = CompassPointSecond(rawValue:"South")//.South
if let south = point {
south.rawValue // "South"
}

Swift 学习笔记 (枚举)的更多相关文章

  1. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  2. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

  3. Swift学习-枚举(Enumerations)的使用方法

    Swift学习-枚举的使用方法 枚举的使用语法: enum someEnumer { // 枚举的成员值 } 以下是方向的一个例子: enum direction { case Up case Dow ...

  4. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. Swift学习笔记 - 位移枚举的按位或运算

    在OC里面我们经常遇到一些枚举值可以多选的,需要用或运算来把这些枚举值链接起来,这样的我们称为位移枚举,但是在swift里面却不能这么做,下面来讲解一下如何在swift里面使用 OC的位移枚举的区分 ...

  6. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  7. swift学习笔记4——扩展、协议

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  8. swift学习笔记1——基础部分

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  9. 记录:swift学习笔记1-2

    swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...

随机推荐

  1. mysql控制台入门级--简单的创建表,字段。。。(用于网站测试)

    一:在Mysql控制台创建数据表 [sql]  use ceshi;  create table student  (      stuid int primary key auto_incremen ...

  2. Maven在[INFO] Generating project in Interactive mode卡住的问题解决

    我的环境: Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00) Maven ...

  3. 开源日历TimesSquare在iOS7下诡异渲染的解决办法

    因为没有时间自己写一个日历,所以暂时使用了一个三方的日历https://github.com/square/objc-TimesSquare 但是在iOS7下.突然产生了一个诡异的BUG..如下图: ...

  4. iOS7开发技巧

    和任何新的iOS版本一样,有着一堆堆的新技巧和修改需要处理.有些我并不会立即遇到,所以这篇文章并不是一套完整技巧汇总.只是分享一些我碰巧遇到的问题. 如果你有任何更多的发现,可以发Twitter或者e ...

  5. numpy基础语法

    np.zeros(5) [ 0.  0.  0.  0.  0.] 所得类型为数组, numpy.zeros_like(a, dtype=None, order='K', subok=True) 生成 ...

  6. 剑指Offer面试题51(Java版):数组中反复的数字

    题目:在一个长度为n的数组里的全部数字都在0到n-1的范围内. 数组中某些数字是反复的,但不知道有几个数字反复了.也不知道每一个数字反复的次数.请找出数组中随意一个反复的数字. 比如假设输入长度为7的 ...

  7. ASP.NET WebAPI 路由规则与POST数据 【转】

    http://www.cnblogs.com/liulun/archive/2012/06/20/2556556.html 蛋疼的路由规则约定 在上一篇文章中 我们成功通过AJAX获取到了服务器的数据 ...

  8. 过滤器Filter_03_多个Filter的执行顺序

    过滤器Filter_03_多个Filter的执行顺序 学习了:https://www.cnblogs.com/HigginCui/p/5772514.html 按照在web.xml中的顺序进行filt ...

  9. jsp页面中,动态调用系统时间的实现

    在做WEB项目时,经常会须要 在页面中显示当前时间,以下介绍一个简单的调用系统时间的方法,效果如图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvczI5 ...

  10. 应用设置Setting的实现

    有非常多应用都在iOS设置中有相关的设置.例如以下图:     通过这个设置能够方便的相应用的一些主要的设置进行更改. 要完整的实现这个设置功能,有下面几方面问题须要解决: 1)设置的编写(实现设置的 ...