Swift 学习笔记 (枚举)
枚举为一种相关值定义了一个通用类型,从而可以让你在代码中类型安全的操作这些值。
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 学习笔记 (枚举)的更多相关文章
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- Swift学习笔记(一)搭配环境以及代码运行成功
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
- Swift学习-枚举(Enumerations)的使用方法
Swift学习-枚举的使用方法 枚举的使用语法: enum someEnumer { // 枚举的成员值 } 以下是方向的一个例子: enum direction { case Up case Dow ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- Swift学习笔记 - 位移枚举的按位或运算
在OC里面我们经常遇到一些枚举值可以多选的,需要用或运算来把这些枚举值链接起来,这样的我们称为位移枚举,但是在swift里面却不能这么做,下面来讲解一下如何在swift里面使用 OC的位移枚举的区分 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记4——扩展、协议
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记1——基础部分
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- 记录:swift学习笔记1-2
swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...
随机推荐
- 详解Swift和OC的混编
前言: 我们在一些情况下,仅仅使用swift 是无法完成一个项目的,在swift项目中必要用到 OC 实现一些功能,比如,项目要使用一些第三方的框架,但这个第三方的框架却是用 OC 实现的,或者你的项 ...
- 洛谷——P1977 出租车拼车
题目背景 话说小 x 有一次去参加比赛,虽然学校离比赛地点不太远,但小 x 还是想坐 出租车去.大学城的出租车总是比较另类,有“拼车”一说,也就是说,你一个人 坐车去,还是一堆人一起,总共需要支付的钱 ...
- Topshelf+Quartz.net+Dapper+Npoi(一)
背景 前段时间公司有个需求(每天给业务导出一批数据,以excel的形式通过邮件发送给他).A说:直接写个服务,判断等于某个时间点,执行一下sql语句,生成excel,写个EmaiHelper发送给他不 ...
- SecureCRT介绍、安装、使用(转)
http://blog.csdn.net/liang19890820/article/details/49701429 简介 SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简 ...
- ios界面笔记(二)
1,在ios下实现checkbox的效果 主要思路是添加一个button,然后读取其isselected属性,分别添加不同的界面图片即可 具体实现如下: 2,解决两个window切换时消息无法送达 主 ...
- Copy Records From One Data Block To Another Data Block In Oracle Forms
In this tutorial you will learn to copy the records from one data block to another data block on sam ...
- C# 计算一串字符串算法
工作中遇到一个小问题,就是要做一个类似excel那种的公式的东西,就是A0+A1*B0那样的公式,然后得出结果. 首先,分析. 这不是计算器,计算器要比这个简易,计算器是所按即所得,即你点击+-之类的 ...
- mysql----乐观锁总结和实践
悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这 ...
- 高校师生福利!从现在起,可以免费申请LocaSpace和Wish3D的SDK!
目前,以管理空间数据见长的GIS已经在全球变化与监测.军事.资源管理.城市规划.土地管理.环境研究.灾害预测.交通管理.文物保护以及政府部门等许多领域发挥着越来越重要的作用. 如何开发出功能丰富又简洁 ...
- glsl镜面水倒影的实现[转]
http://blog.sina.com.cn/s/blog_78ea87380101ejbf.html 使用两相机,一个master相机, 主要负责场景的渲染, 另一个rtt相机, 和master相 ...