let five =ArithmeticExpression.number(5)let four =ArithmeticExpression.number(4)let sum =ArithmeticExpression.addition(five, four)let product =ArithmeticExpression.multiplication(sum,ArithmeticExpression.number(2))funcevaluate(_ expression:ArithmeticExpression)->Int{switch expression {caselet.number(value):return value
caselet.addition(left,right):returnevaluate(left)+evaluate(right)caselet.multiplication(left,right):returnevaluate(left)*evaluate(right)// (5 + 4) * 2}}print(evaluate(product))// 打印“18”
八、嵌套枚举
Swift 中允许枚举嵌套,在使用时,需要确保一个枚举类型是从属于另一个枚举类型的,否则会引起语义混乱。下面看一个例子:
enumCharacter{enumWeapon{caseBowcaseSwordcaseLancecaseDagger}enumHelmet{caseWoodencaseIroncaseDiamond}caseThiefcaseWarriorcaseKnight}// 通过层级来访问嵌套的枚举成员let character =Character.Thieflet weapon =Character.Weapon.Bowlet helmet =Character.Helmet.Iron
访问嵌套枚举成员时,不必每次都输入这么长的层级来访问,可以使用便捷方法直接访问,如下:
funcstrength(of character:Character,
with weapon:Character.Weapon,
and armor:Character.Helmet){}strength(of:.thief, with:.bow, and:.wooden)
九、包含枚举
也可以在结构或类中嵌入枚举。继续前面的例子:
structCharacter{enumCharacterType{case thief
case warrior
case knight
}enumWeapon{case bow
case sword
case lance
case dagger
}let type:CharacterTypelet weapon:Weapon}let warrior =Character(type:.warrior, weapon:.sword)
十、方法和属性
Swift 枚举类型可以附加方法和属性:
enumTransportation{casecar(Int)casetrain(Int)funcdistance()->String{switchself{case.car(let miles):return"\(miles) miles by car"case.train(let miles):return"\(miles) miles by train"}}}
与结构或类类型的主要区别在于,可以在方法中使用 self 来计算输出。
十一、“属性”添加限制
Swift 中不允许添加存储属性,下面的代码会编译报错:
enumDevice{case iPad
case iPhone
let introduced:Int// Enums must not contain stored properties}
应该使用计算属性,如下:
enumDevice{case iPad,case iPhone
var introduced:Int{switchself{case.iPhone:return2007case.iPad:return2010}}}
十二、静态方法
静态方法是可以通过类型名称而不是类型的特定实例调用的方法。例子如下:
enumDevice{staticvar newestDevice:Device{return.appleWatch
}case iPad,case iPhone
case appleWatch
}
enumTriStateSwitch{case off, low, bright
mutatingfuncnext(){switchself{case.off:self= low
case.low:self=.bright
case high:self= off
}}}var ovenLight =TriStateSwitch.low
ovenLight.next()// ovenLight is now equal to .bright
ovenLight.next()// ovenLight is now equal to .off
一、前言枚举是为一组相关值定义的一个通用类型,Swift 枚举的功能非常强大,使它比 OC 的枚举应用于更广泛的场景。在本文,我们去了解 enum 的语法和能力。二、枚举语法使用 enum 关键字引入枚举,其整个定义放在一对大括号内:enum CompassPoint { case north case south case east case west}与 C 和 Objective-C 不同,Swift 的枚举成员在创建时不会被赋予一个默认的整型