枚举就是给一组值定义一种类型,作用是类型安全地使用这些值。C语言中的枚举,会默认分配从0增长。Swift中,可以有原始值,也可以没有。类型可以为字符串,字符,数值。除了原始值,还有关联值,关联值类型可以为任意类型。(需不需要类型统一)
枚举还支持计算属性,实例方法,构造函数,协议
语法:
enum Type {
case type1
case type2
case type3
}
type1
,type2
,type3
不会被默认赋值0
,1
,2
还可以写成
enum Type {
case type1,type2
case type3
}
赋值
enum Type {
case type1,type2
case type3
}
var type = Type.type1
type = .type2
print(type)
type
为Type
类型,值为type1
。由于type
类型已经确定,所以第二次赋值时,可以省略类型名
使用 Switch 语句匹配枚举值
switch type{
case .type1:
print(type)
case .type2:
print(type)
case .type3:
print(type)
}
default
switch type{
case .type1:
print(type)
default:
print(type)
}
原始值
原始值(默认值)类型必须统一,原始值必须是字面量,必须唯一
enum Type:Int {
case type1 = 1
case type2
case type3
}
print(Type.type1.rawValue)
print(Type.type2.rawValue)
print(Type.type3.rawValue)
在类型名后指定原始值类型,在类型值后指定原始值,打印1,2,3
,这说明,后面的两个值是自动累加。
那试试字符串类型,赋值a,后面会不会自动赋值b,c
enum Type:String {
case type1 = "a"
case type2
case type3
}
print(Type.type1.rawValue)
print(Type.type2.rawValue)
print(Type.type3.rawValue)
打印a type2 type3
,默认把枚举名当作字符串作为原始值
那再试试字符类型
enum Type:Character {
case type1 = "a"
case type2 = "b"
case type3
}
print(Type.type1.rawValue)
print(Type.type2.rawValue)
print(Type.type3.rawValue)
报错为:当不是string
和int
类型时,枚举必须有确定的值。
因为string
,int
可以推断后续的值?
枚举的隐式赋值
当类型为string
和int
,后续的值可以被隐式赋值
int
累加,string
为string类型,值为枚举名
关联值
关联值类型可以不同
enum Type{
case type1(Int,Int)
case type2(String)
}
var a = Type.type2("123")
var b = Type.type1(1, 1)
print(a,b)
switch a{
case .type1(let a,let b):
print("\(a) \(b)")
case .type2(let a):
print(a)
}
有了关联值好像就不可以有原始值?
当绑定类型相同时,可以把let
写前面
switch a{
case let .type1(a,b):
print("\(a) \(b)")
case .type2(let a):
print(a)
}
关联值和原始值是不同的,原始值是枚举定义时预填充的值,对于特定的枚举类型,原始值是不变的。关联值是创建一个基于枚举成员的常量或变量时才设置的值,枚举成员的关联值可以变化。
使用原始值初始化枚举
enum Type:Int{
case type1 = 1
case type2 = 2
}
var type = Type(rawValue: 1)
print((type?.rawValue)!)
在定义了原始值后,将自动获得Type(rawValue:1)
构造方法,这是一个可失败构造器,返回可选类型。
递归枚举
暂时不做讲解