枚举定义了一个通用类型的一组相关值,使你可以在你的代码中以一种安全的方式来使用这些值。
// 定义枚举的语法 enum Chips { // 定义了薯片的枚举,包含了3种口味的成员 case Tomato case Original case Barbecue }
每个枚举定义了一个全新的类型。像 Swift 中其他类型一样,它们的名字必须以一个大写字母开头。给枚举类型起一个单数名字而不是复数名字,以便于读起来更加容易理解.
一般匹配枚举值都是用switch
var chip = Chips.Original // 匹配枚举值 switch chip { case .Tomato : print("tomato") case .Original : print("original") case .Barbecue : print("barbecue") }
上面的例子演示了枚举的基本语法,下面来记录一下为成员值赋予一个任何属性的相关值,一起储存起来的话一些特别情况会更便利些
// <假如>自定义了一个控件需要传控件的显示形式(如button的custom) enum ViewType { case Normal(String) // 比如说需要传进一个要显示的字符串 case Contains(Double, Double) // 比如说需要传进显示比例 } var viewType = ViewType.Normal("传入了需要显示的字符串(赋予了相关值)") switch viewType { case .Normal(var str) : print("设置控件需要显示的字符串"); case let .Contains(widthScale, hightScale) : print("设置控件的宽高缩放比例"); }
作为相关值的另一种选择,枚举成员可以被默认值(称为原始值)赋值,其中这些原始值具有相同的类型。
enum Month : Int { // 因为原始值类型必须一致 所以将原始值定义为Int 注意:原始值和相关值不能同时使用 case January // 如果没有给定原始值 会隐式将第一个成员赋值为0,随后的每一个成员递增1 case February case March case April } var february = Month.February print(february, february.rawValue) // 输出:"February 1 "
enum Month : Int { // 也可以将所有成员值缩减到1行 与之前的效果是一样的 case January = 1, February, March, April } var february = Month.February print(february, february.rawValue) // 输出:"February 2 "
注:如果初始值为Float或Double的话也会默认递增1
enum Month : String { // 如果是字符串类型的初始值、并且没有显式的赋值,那么就将成员名字设置为初始值 case January = "1月", February, March, April } var january = Month.January print(january, january.rawValue) // 输出:"January 1月 " var march = Month.March print(march, march.rawValue) // 输出:"March March "
下面来记一下通过原始值来构造枚举
enum ViewContentType : Int { // 模拟一个视图的内容模式 case Normal = 0, System, Custom, Ancient } // 根据原始值构造一个枚举 if let type = ViewContentType(rawValue: 2){ // 注意 原始值构造器是可失败构造器(可能会返回nil)所以返回的是可选类型,需要使用可选绑定 switch type { case .Normal: // do something... print(type) case .System: // do something... print(type) default: // do sonthing... print(type) // 最后输出这一句 } }
下面来记录下相比较OC中的枚举 Swift枚举的新特性:Swift中 枚举可以定义类型属性和实例属性
// <假如>自定义了一个控件需要传控件的显示形式(如button的custom) enum ViewType { // 我们拿这个枚举举例 假如说声明一个实例属性可以返回相对应成员值的size 注意 viewSize是只读的计算属性 var viewSize : CGSize { switch self { // 参数暂时省略 // 可以根据不同的成员返回相对应的size case .Normal(_) : return CGSize( 100, height: 20) case .Contains(_, _) : return CGSize( 390, height: 300) } } // 声明类型属性 static let comment = "这个枚举有两个成员,设置不同的值来改变控件的摆布状态" case Normal(String) // 比如说需要传进一个要显示的字符串 case Contains(Double, Double) // 比如说需要传进显示比例 } let type = ViewType.Normal("一个字符串") // 调用实例计算属性 获得size let viewSize = type.viewSize // 调用类型计算属性 print(ViewType.comment)
枚举还可以声明方法
enum Month : Int { // 因为原始值类型必须一致 所以将原始值定义为Int 注意:原始值和相关值不能同时使用 // 枚举可以声明方法 就跟类的写法一样 不过要是修改自身的值就需要加一个关键字 mutating func nextMonth() -> String { switch self { case January : self = February return "已经到2月拉" case .February : self = March return "已经到3月拉" default : return "以此类推" } } case January // 如果没有给定原始值 会隐式将第一个成员赋值为0,随后的每一个成员递增1 case February case March case April } var month = Month(rawValue: 0) // january let string = month?.nextMonth() // 返回一个字符串 并且把成员值改为February print(month) // 打印出 "Optional(Month.February) "