Swift(九、枚举)
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)相当于枚举成员的补充,存储成员值之外的自定义信息 以官方文档的例子进行解说 定义Barcode的枚举类型,成员其一为具有 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
注意点: 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))
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |