# Swift枚举
枚举是由用户定义的数据类型的一组相关值。关键字 `enum` 用来定义枚举数据类型。
###枚举功能
– 枚举在 swift 也类似于 C 和 Objective C 中结构类型
– 它是在一个类中声明,其值是通过该类的实例来访问
– 初始成员值是用枚举初始化定义的
– 其功能也扩展确保标准的协议功能
###语法
枚举引入 `enum` 关键字和一对大括号内将它们定义:
enum enumname {
// enumeration values are described here
}
例如,可以为星期定义枚举如下:
enum DaysofaWeek {
case Sunday
case Monday
—
case Saturday
}
示例
enum names{
case Swift
case Closures
}
var lang = names.Closures
lang = .Closures
switch lang
{
case .Swift:
println(“Welcome to Swift”)
case .Closures:
println(“Welcome to Closures”)
default:
println(“Introduction”)
}
当我们上面的程序使用 playground 运行,我们得到以下结果
Welcome to Closures
Swift 中的枚举不象 C 和 Objective C 分配其成员的默认值,相反,成员由它们枚举名称明确定义。枚举名称应该使用大写字母(例如:`enum DaysofaWeek`)。
var weekDay = DaysofaWeek.Sunday
这里所述枚举名`’DaysofaWeek’`被分配给一个变量 weekday.Sunday。它通知编译器数据类型属于周日将被分配给该特定类的后续枚举成员。一旦枚举成员的数据类型定义,其成员可以通过传递值,并进一步计算进行访问。
枚举与Switch语句
Swift 中的 ‘Switch’ 语句也遵循了多路选择。 只有一个变量被以基于指定的条件的特定时间访问。默认情况下,在switch语句用于捕获不确定的情况(case)。
enum Climate{
case India
case America
case Africa
case Australia
}
var season = Climate.America
season = .America
switch season
{
case .India:
println(“Climate is Hot”)
case .America:
println(“Climate is Cold”)
case .Africa:
println(“Climate is Moderate”)
case .Australia:
println(“Climate is Rainy”)
default:
println(“Climate is not predictable”)
}
当我们上面的程序使用 playground 运行,我们得到以下结果
Climte is Cold
该程序首先定义了`Climate` 作为枚举名称。那么它的成员如, `’China’`, `’America’`, `’Africa’` 和 `’Australia’` 声明属于类 `’Climate’`. 现在成员 `America` 被分配到一个 `Season` 变量。此外,`Switch case`可以找到对应 `.America` 的值,并跳转到该特定语句。 输出将显示为 `“Climate is Cold”`。同样,所有成员可以通过 `switch` 语句访问。 当条件不满足它打印默认内容 `’Climate is not predictable’`
枚举可进一步划分到相关的值和原始值。
关联值和原始值之间的差异
|关联值 |原始值|
|——-|——|
|不同的数据类型 |相同的数据类型|
|例如: `enum {10,0.8,”Hello”}`| 例如: `enum {10,35,50}`|
|在常量值或变量基础上创建值 | 预先填充值|
|每次声明都会变化| 成员的值不变|
###枚举与关联值
enum Student{
case Name(String)
case Mark(Int,Int,Int)
}
var studDetails = Student.Name(“Swift”)
var studMarks = Student.Mark(98,97,95)
switch studMarks {
case .Name(let studName):
println(“Student name is: \(studName).”)
case .Mark(let Mark1, let Mark2, let Mark3):
println(“Student Marks are: \(Mark1),\(Mark2),\(Mark3).”)
default:
println(“Nothing”)
}
当我们上面的程序使用 playground 运行,我们得到以下结果
Swift
98
97
95
例如,考虑访问学生的名字和标记固定在三个科目枚举名称被声明为 `student` ,而在枚举类中的成员名称都属于字符串数据类型,标记表示为 `mark1`, `mark2` 和 `mark3`
数据类型为整数。若要访问的是学生的名字或标记分数:
var studDetails = Student.Name(“Swift”)
var studMarks = Student.Mark(98,97,95)
现在,如果块初执行,`switch case` 将打印学生姓名,否则它将打印学生固定的标记。 如果这两个条件都失败了,将执行默认块。
###枚举与原始值
原始值可以是字符串,字符,或任何整数或浮点数类型。每个原始值必须在其枚举声明中是唯一的。当整数用于原始值,如果指定的一些枚举成员没有任何值,它们会自动递增。
enum Month: Int {
case January = 1, February, March, April, May, June, July, August, September, October, November, December
}
let yearMonth = Month.May.rawValue
println(“Value of the Month is: \(yearMonth).”)
当我们上面的程序使用 playground 运行,我们得到以下结果:
Value of the Month is: 5.