定义的语法和C/C++很像,只不过前面多了case语句
enum TextColor{ case blue case black case green case red case white }第一次创建枚举实例的时候必须指定枚举枚举类型和值,之后的代码可以省略类型
//显示类型声明 var color1:TextColor=TextColor.black //使用推断类型 var color2=TextColor.blue //给枚举实例赋值 color2 = .white //判断枚举实例的值 if (color2 == .white){ print("color is white") }不要忘记switch语句必须能处理值的所有可能性
switch color1 { case .blue: print("color is blue") case .black: print("color is black") case .green: print("color is green") case .red: print("color is red") case .white: print("color is white") }不同于C/C++,枚举实例并非是整形,不过利用原始值这一特性,也可以得到同样的效果
enum TextColor:Int{ case blue=1 case black=2 case green=3 case red=40 case white=60 }对于整形,如果不给枚举成员赋值,则默认从0开始,并依次递增 对于字符串,如果不给枚举成员赋值,则会使用成员本身的名称
enum TextColor:Int{ case blue=2 case black//3 case green//4 case red//5 case white//6 }通过rawValue可获取原始值
print(TextColor.red.rawValue)将原始值转换为枚举值,由于可能转换失败,所以返回的是可空类型
if let myColor=TextColor(rawValue: 200){ print("convert success \(myColor)") }else{ print("convert failed") }不同于其他编程语言,swift的枚举中可以定义方法,其中self代表自身实例
enum TextColor{ case blue case black case green func getColorValue()->Int{ switch self { case .black: return 1 case .blue: return 2 case .green: return 3 } } } var color=TextColor.black; print(color.getColorValue())//1在swift中,枚举是值类型,值类型的方法不能对self进行修改,如果需要修改,需要标记这个方法为mutating
enum TextColor{ case blue case black case green mutating func setColorValue(){ self = .blue } } var color=TextColor.black; color.setColorValue() print(color)//blue枚举中的不同成员可以有不同的关联值,使用关联值可以将数据附加在枚举实例上
enum Shape{ //点 case point //正方形 case oquare(side:Double) //长方形 case rectangle(width:Double,height:Double) //获取面积 func area() -> Double{ switch self { case .point: return 0 case let .oquare(side: s): return s * s case let .rectangle(width: w, height: h): return w * h } } } var shape1=Shape.oquare(side: 10.0) var shape2=Shape.rectangle(width: 20.0, height: 40.0) print(shape1.area()) print(shape2.area())当关联值的类型为当前枚举类型时,会出现递归的情况,这个时候编译器会报错,因为编译器无法确定该类型所占用的内存,这个时候可以使用关键字indirect,告诉编译器把数据放到指针指向的地方,这个时候枚举实例占用的内存就变成了一个指针的长度
indirect enum Shape{ case oquare(parentShape:Shape) }