原文:Swift中文教程(六)--枚举和结构

Enumerations 枚举

使用 enum 来创建一个枚举。跟Classes(类)和其他类型的命名方式一样,枚举也可以有Method(方法)。

 enum Rank: Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescription() -> String {
switch self {
case .Ace:
return "ace"
case .Jack:
return "jack"
case .Queen:
return "queen"
case .King:
return "king"
default:
return String(self.toRaw())
}
}
}
let ace = Rank.Ace
let aceRawValue = ace.toRaw()

练习:

创建一个函数,通过原始值的类比来比较两个rank的值。

在上例中,原始值的类型是 Int ,所以你可以只指定第一个原始值就可以了,因为后面的原始值都是按照顺序赋值的。你还也可以使用字符串或浮点数作为枚举的原始值。

使用toRaw和fromRaw函数可以实现原始值和枚举值间的转换:

 if let convertedRank = Rank.fromRaw(3) {
let threeDescription = convertedRank.simpleDescription()
}

枚举出来的值就是实际值,而不是其他方式写的原始值。(这句话的意思应该就是说枚举值和原始值没有必然的关联性)为了防止枚举无意义的原始值,你不需要特意提供一个原始值:

 enum Suit {
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades:
return "spades"
case .Hearts:
return "hearts"
case .Diamonds:
return "diamonds"
case .Clubs:
return "clubs"
}
}
}
let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()

练习:

给枚举Suit创建一个名为color的方法,让Spades和Clubs返回“black”,让Hearts和Diamonds返回“red”。

请注意上例中引用Hearts成员的两种方式:当给常量Hearts赋值时,Suit.Hearts是全名引用,因为此时的常量Hearts没有一个明确的类型。而在switch内部,枚举通过缩略形式:.Hearts来引用,因为 self 的值对于枚举成员是已知的。当值的类型已知时,你可以随时使用缩略形式(去引用)。

Structures 结构

使用struct关键字创建来创建结构。结构体支持类(Classes)的许多行为:如,方法(methods)和构造器(initializers)。结构体与类最重要的区别是,在代码中,结构体通过拷贝(copy)来实现值的传递,而类则是通过引用(reference):

 struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

练习:

添加一个Card方法来创建一副纸牌,每一张牌都含有一个Rank和Suit的组合。

一个枚举成员的实例可以拥有实例的值。相同枚举成员的实例可以有不同的值。你在创建实例时可以给它指定一个值。指定值和原始值的区别在于:枚举的原始值与所有实例相同,原始值是你在定义枚举时提供的。

例如:有一个场景,需要你从服务器中请求太阳升起和降落的时间,服务器可以响应给你相应的信息,也能给你返回错误的信息:

 enum ServerResponse {
case Result(String, String)
case Error(String)
} let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.") switch success {
case let .Result(sunrise, sunset):
let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
case let .Error(error)://请求错误时返回的信息--Joe.Huang
let serverResponse = "Failure... \(error)"
}

练习:

在switch语句里给ServerResponse添加第三种情况(case)。

请注意:(上例中)ServerResponse所返回的日出与日落时间是switch中所匹配的情况(case)。

谢谢,Swifter-QQ群:362232993,同好者进~

github地址:https://github.com/Joejo/Swift-lesson-for-chinese

Swift中文教程(六)--枚举和结构的更多相关文章

  1. Swift中文教程(四)--函数与闭包

    原文:Swift中文教程(四)--函数与闭包 Function 函数 Swift使用func关键字来声明变量,函数通过函数名加小括号内的参数列表来调用.使用->来区分参数名和返回值的类型: fu ...

  2. Swift中文教程(一)--欢迎来到Swift的世界

    原文:Swift中文教程(一)--欢迎来到Swift的世界 Apple凌晨时在WWDC发布了Swift编程语言,语法简介我很喜欢,市面上没有完整的中文教程,我在ibooks里面下载了英文原版,现在开始 ...

  3. Swift中文教程(二)--简单值

    原文:Swift中文教程(二)--简单值 Swift使用let关键字声明常量,var关键字声明变量.常量无需在编译时指定,但至少要被赋值一次.也就是说,赋值一次多次使用: var myVariable ...

  4. Swift中文教程(三)--流程控制

    原文:Swift中文教程(三)--流程控制 Swift用if和switch编写条件控制语句,用for-in,for,while和do-while编写循环.条件控制语句和循环语句中,小括号是可选的,但花 ...

  5. Swift中文教程(五)--对象和类

    原文:Swift中文教程(五)--对象和类 Class 类 在Swift中可以用class关键字后跟类名创建一个类.在类里,一个属性的声明写法同一个常量或变量的声明写法一样,除非这个属性是在类的上下文 ...

  6. Apple Swift 中文教程 高速參考 基本的语法

    总的来说.语法有java的味道,也有python的味道,还有swift自己的味道. 有些语法还是挺不伦不类的,不太好理解,即使你有几年的java或python经验,也不见得有些语法你能非常轻松的看明确 ...

  7. Swift具体解释之六----------------枚举、结构体、类

    枚举.结构体.类 注:本文为作者自己总结.过于基础的就不再赘述 ,都是亲自測试的结果.如有错误或者遗漏的地方.欢迎指正,一起学习. 1.枚举 枚举是用来定义一组通用类型的一组相关值 ,关键字enum ...

  8. Swift中文教程(七)--协议,扩展和泛型

    Protocols and Extensions 协议(接口)和扩展 Swift使用关键字protocol声明一个协议(接口): 类(classes),枚举(enumerations)和结构(stru ...

  9. Swift中文教程(二)基本运算符

    1.基本运算符 运算符是一种特定的符号或表达式,用来检验.改动或合并变量.比如,用求和运算符+能够对两个数字进行求和(如let i = 1 + 2):略微复杂一点的样例有逻辑与操作符&& ...

随机推荐

  1. win8.1 usb3 速度慢的解决方法

    我买的金士顿u盘 驱动也装了,口业插对了 速度还是很慢 30m左右 解决方法 1 搞定了·,主板驱动问题.卸了主板驱动usb3.0的速度立马上100m/s,即使装了联想官方的驱动也会影响USB3.0的 ...

  2. 玩转Web之JavaScript(三)-----javaScript语法总结(三) 窗口/滚动条/文本的相关语法

    JS语法集锦(三) 窗口/滚动条/文本 alert("文本")    警告框:警告框经常用于确保用户可以得到某些信息,当警告框出现后,用户需要点击确定按钮才能继续进行操作. con ...

  3. android代码集EditText只要输入号码、信

     如何设置EditText,因此,只有某些数字或字母可以进入它? 一.建立EditText,只要输入号码: 办法1:直接生成DigitsKeyListener了. et_1.setKeyListe ...

  4. asp.net webapi 多文件上传

    使用enctype="multipart/form-data"来进行操作 /// <summary> /// 上传图片 /// </summary> /// ...

  5. SQL Server 2008性能故障排查(三)——I/O

    原文:SQL Server 2008性能故障排查(三)--I/O 接着上一章:CPU瓶颈 I/O瓶颈(I/O Bottlenecks): SQLServer的性能严重依赖I/O子系统.除非你的数据库完 ...

  6. Cordova WP8 插件开发

    原文:Cordova WP8 插件开发 前面博客中介绍了Cordova WP8平台上的安装部署,Cordova扩展可以利用WP8本地代码扩展WebApp的功能,调用本地能力需要开发相应的插件,下面以闪 ...

  7. Grant的时候报错的解决:Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)

    mysql> grant all on *.* to 'root'@'192.168.1.1' identified by 'password'; ERROR 1045 (28000): Acc ...

  8. ecshop广告调用方法

    在简单地概括ecshop广告调用该方法,已发表在博客上,在这里,我们总结了以下 :就是官方默认的方法.先加入广告位,然后加入模板的广告位区域,再在将两者相应上. 1.后台 > 广告管理 > ...

  9. 模式识别 - libsvm该函数的调用方法 详细说明

    libsvm该函数的调用方法 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26261173 须要载入(load)SVM ...

  10. TCP/IP 网络编程(六)

    流程模型: 线程模型: 线程的创建和运行流程 #include <pthread.h> int pthread_create(pthread_t * restrict thread, co ...