//枚举
enum CompassPoint {
case North
case South
case East
case West
}
//多个成员值可以出现在同一行上,用逗号隔开:
enum fruit{
case apple, melons ,tomato ,watermelon ,banana
}
var ff = CompassPoint.North
//关联值(Associated Values)
enum DLG{
case NAME(String)
case ADDRESS(Int,Int,Int)
}
var myDLG=DLG.NAME("dlg")
override func viewDidLoad() {
super.viewDidLoad()
//与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。这些枚举成员本身 就是完备的值
ff = .South
switch ff {
case .North:
print("Lots of planets have a north")
case .South:
print("Watch out for penguins")
case .East:
print("Where the sun rises")
case .West:
print("Where the skies are blue")
}//Watch out for penguins
//定义一个DLG的枚举类型,它的一个成员值是具有String类型关联值的NAME,它的另一个成员值时具有(Int,Int,Int)类型关联值的ADDRESS
myDLG=DLG.ADDRESS(10, 6, 9) //创建了一个名为myDLG的变量,并将DLG.ADDRESS赋值给它,关联的元组为(10,6,9)
//在同一时间只能存储这两个值中 的一个
switch myDLG{
case .ADDRESS(let a, let b, let c):
print("ADDRESS: \(a),\(b),\(c).")
case .NAME(let myname):
print("NAME: \(myname)")
}//ADDRESS: 10,6,9.
//如果一个枚举成员的所有关联值都被提取为常量,或者都被提取为变量,为了简洁可以只在成员名称前标注 一个let 或者var
switch myDLG{
case let.ADDRESS( a, b, c):
print("ADDRESS: \(a),\(b),\(c).")
case .NAME(let myname):
print("NAME: \(myname)")
}//ADDRESS: 10,6,9.
//原始值(Raw Values)
//原始值可以是字符串,字符,或者任意整型值或浮点型值。每个原始值在枚举声明中必须是唯一的。
//原始值和关联值是不同的。原始值是在定义枚举时被预先填充的值,对于一个特定的枚 举成员,它的原始值始终不变。关联值是创建一个基于枚举成员的常量或变量时才设置的值,枚举成员的关联值 可以变化。
enum plant : Int{
case MMM=1, NNN,YYY,ZZZ
}
let aaa=plant.NNN
print(aaa.rawValue) //2
//使用枚举成员的 rawValue 属性可以访问该枚举成员的原始值:
let bbb=plant(rawValue: 3)!//原始值构造器,返回值则是枚举成员或nil
print(bbb)//YYY
//计算 (5+2)*4
let myfive = Arithmetic.Number(5)
let mytwo = Arithmetic.Number(2)
let myfour = Arithmetic.Number(4)
let myadd = Arithmetic.Add(myfive, mytwo)
let mymult = Arithmetic.Multiplic(myadd, myfour)
print(mymult)
//Multiplic(
//swift测试.ViewController.Arithmetic.Add(
//swift测试.ViewController.Arithmetic.Number(5),
//swift测试.ViewController.Arithmetic.Number(2)
// ),
//swift测试.ViewController.Arithmetic.Number(4)
//)
let result = evaluate(mymult)
print(result)//28
}
//递归枚举
//递归枚举(recursive enumeration)是一种枚举类型,它有一个或多个枚举成员使用该枚举类型的实例作为关联值。使用递归枚举时,编译器会插入一个间接层。你可以在枚举成员前加上 indirect 来表示该成员可递归。
//枚举类型开头加上 indirect 关键字来表明它的所有成员都是可递归的
indirect enum Arithmetic{
case Number(Int)
case Add(Arithmetic,Arithmetic)
case Multiplic(Arithmetic,Arithmetic)
}
func evaluate(exp:Arithmetic)->Int{
switch exp
{
case .Number(let value):
return value
case .Add(let oneArithmetic, let twoArithmetic):
return evaluate(oneArithmetic) + evaluate(twoArithmetic)
case .Multiplic(let oneArithmetic, let twoArithmetic):
return evaluate(oneArithmetic) * evaluate(twoArithmetic)
}
}