本文章纯粹是中文版《The Swift Programming Language》的学习笔记,所以绝大部分的内容都是文中有的。本文是本人的学习笔记,不是正式系统的记录。仅供参考
以下还是有很多没看懂、不确定的地方,我会以“存疑”的注解指出。
在此感谢中文版翻译者,这极大地加快了 Swift 的学习速度。
本文地址:https://segmentfault.com/a/1190000008627744
Reference:
原版:The Swift Programming Language
中文版:Swift 3 编程语言 - 枚举
枚举
Swift 中的枚举不需要对应真实的值。枚举的值可以是 String
, Character
, Integer
, Float
等类型。同时,枚举中的一个值可以与多个类型相关联起来。
基本语法:
enum CompassDirection {
case north
case south
case east
case west
}
初始化和赋值:
var dirToHead = CompassDirection.west
dirToHead = .east
注意值处理都需要在前面加上 “.
”。这里实际上是隐式省略了 “CompassDirection”。
需要注意的是,如果将 enum 用在 switch 语句中,需要全覆盖
所有的值。
关联值
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
上面这段语法的意思是:定义一个叫做 Barcode
的数值类型,它要么用 (Int, Int, Int, Int) 类型的关联值截取 upc 值,要么使用 String 类型的关联值街区一个 qrCode 值。
赋值:
var productBarcode = Barcode.upc(8, 85907, 51226, 3)
productBarcode = .qrCode("ABCDEFG")
Swift 写法:
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
print("QR code: \(productCode).")
}
如果变量里面统一是使用 let
或者统一使用 var
,那么可以简写成一个:
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
print("QR code: \(productCode).")
}
原始值
enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
上面的例子告诉我们,可以指定 enum 的原始值类型。
如果没有给 enum 显示指定值类型,那么 Swift 会默认将每个值的原始值设置为其名字本身的 String 类型。
也可以像 C
那样,使用整型值,也可以自动排序下来。如下:
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
这个时候,我们会涉及到一个构造方法:rawValue
。参见以下初始化:
let possiblePlanet = Planet(rawValue: 7)
注意,此时的 possiblePlanet 变量类型是 “Planet?
”,注意其中的问号。因为使用 rawValue 初始化 enum,可能得到一个非法值。上面这一句,变量的值是 nil
。
递归变量
暂时不看。需要注意的是 indirect
关键字。