1、Swift入门学习笔记(第一版),对Swift的基础知识点进行梳理总结。知识点一直在变,只是作为参考,以苹果官方文档为准~
2、在学习完基本的知识点以后会结合官方文档及相关资料,在此版本的基础上进行添加更改。
九、枚举
C语言中枚举名和一个整数值相对应。而Swift不用。不过给枚举成员提供值(“原始”值),值类型可以为字符串,字符或者一个整型值或浮点数
1、枚举语法
定义
enum CompassPoint {
case North
case South
case East
case West
}
另一形式:
enum CompassPoint {
case North,South,East,West
}
a、case关键字表示一行新的成员值将被定义
b、区别于C/OC,Swift枚举成员不会被赋予默认的整数值!!!
c、这些成员本身就有完备的值,这些值是已经明确定义好的CompassPoint类型
d、每个枚举定义了一个全新的类型,CompassPoint类必须以大写字母开头
2、匹配枚举值
//访问枚举成员
var directionToHead = CompassPoint.East //系统推断directionToHead类型为CompassPoint
//再次赋值,可以用缩写语法(.)来设置,省略枚举名
directionToHead = .North
switch directionToHead {
case .East:
print("East!")
case .South:
print("South!")
case .West:
print("West!")
case .North:
print("North!")
}
Output:
North!
3、关联值(Associated Values)
相当于枚举成员的补充,存储成员值之外的自定义信息
以官方文档的例子进行解说
商品一般有两种条形码, UPC-A 格式(4个整型值)或者QR码格式(字符串)
定义Barcode的枚举类型,成员其一为具有(Int,Int,Int,Int)
类型关联值的UPCA,其二为具有String类型关联值的QRCode。
可以利用Barcode.UPCA
或Barcode.QRCode
存储关联值
enum Barcode {
case UPCA(Int,Int,Int)
case QRCode(String)
}
var productBarcode = Barcode.UPCA(8,85909,51226,3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
第二部操作QRCode及其关联值会替代UPCA及其关联值。
Barcode同意时间只能存储一个变量
可以利用Swift语句来检查器存储了哪一个枚举类型
switch productBarcode {
//case let .UPCA(numberSystem,manufacturer,product,check): //不同形式
case .UPCA(let numberSystem,let manufacturer,let product,let check):
print("UPC-A: \(numberSystem),\(manufacturer),\(product),\(check).")
case .QRCode(let productCode):
print("QR code: \(productCode).")
}
Output:
QR code: ABCDEFGHIJKLMNOP.
4、原始值(Raw Values)
关联值:存储不同类型关联值的枚举成员,可变化
原始值:枚举成员有默认值,但类型须相同,不可变
4.1、原始值的显示赋值
enum testStringEnum: String {
case nameA = "A"
case nameB = "B"
case nameC = "C"
}
print(testStringEnum.nameA.rawValue)
Output:
A
注意点:
a、原始值可以是字符串,字符,或者任意整型值或浮点型值。
b、每个原始值在枚举声明中必须是唯一的。
4.2、原始值的隐式赋值
a、当以整数作原始值,隐式赋值的值依次递增1,第一个枚举成员要赋值,未赋值默认0。
b、当以字符串作为原始值类型,隐式原始值为该枚举成员的名称
enum CompassPoint1:Int {
case North,West
}
print(CompassPoint1.North.rawValue)
Output:
0
4.3、利用初始值初始化枚举实例
返回值为枚举成员或者nil,下面的例子因为Int=5未找到匹配值所以打印为nil
let position = CompassPoint1(rawValue: 5)
print(position?.rawValue)
因为可为nil,因此可以推断position为CompassPoint1?类型,可选类型
注意:原始值构造器是可失败构造器,并非每个原始值都有与之对应的枚举成员(即可能为nil的意思,即前一句话的意思)
5、递归枚举
一种枚举类型,有一个或多个枚举成员使用该枚举类型的实例作为关联值。
使用递归枚举时,编译器会插入间接层。枚举成员前加indirect表示该成员可递归
//用一个算数表达式的枚举递归来说明
enum ArithmeticExpression {
case Number(Int)
indirect case Addition(ArithmeticExpression,ArithmeticExpression)
indirect case Multiplication(ArithmeticExpression,ArithmeticExpression)
}
//indirect写在枚举类型开头表所有成员可递归
//indirect enum ArithmeticExpression {
// case Number(Int)
// case Addition(ArithmeticExpression,ArithmeticExpression)
// case Multiplication(ArithmeticExpression,ArithmeticExpression)
//}
func evaluate(expression:ArithmeticExpression) -> Int {
switch expression {
case .Number(let value):
return value
case .Addition(let left,let right):
return evaluate(left) + evaluate(right)
case .Multiplication(let left,let right):
return evaluate(left) * evaluate(right)
}
}
//计算(2+18)*18
let num1 = ArithmeticExpression.Number(2)
let num2 = ArithmeticExpression.Number(18)
let sum = ArithmeticExpression.Addition(num1,num2)
let product = ArithmeticExpression.Multiplication(sum,ArithmeticExpression.Number(18))
print(evaluate(product))