## ENUMERATION
- 枚举(Enum)可以将一系列相关的值定义为一个组类型,通过如下语法创建 enum:
~~~
enum WeatherType {
case Sun, Cloud, Rain, Wind, Snow
}
~~~
下面看看如何使用枚举类型:
~~~
func getHaterStatus(weather: WeatherType) -> String? {
if weather == WeatherType.Sun {
return nil
} else {
return "Hate"
}
}
getHaterStatus(WeatherType.Cloud)
~~~
也可以这么定义枚举:
~~~
enum WeatherType {
case Sun
case Cloud
case Rain
case Wind
case Snow
}
~~~
也可以这么使用枚举:
~~~
func getHaterStatus(weather: WeatherType) -> String? {
if weather == .Sun {
return nil
} else {
return "Hate"
}
}
//Swift 通过 Type inference 知道你与 WeatherType 类型比较,所以无需写明枚举类型,但是这种写法 Swift 将不会提供代码补足建议辅助
getHaterStatus(.Cloud)
~~~
枚举在 switch/case 中十分有用,因为 Swfit 知道你的枚举类型中都都有什么值,所以能确保你涵盖了所有的 case:
~~~
func getHaterStatus(weather: WeatherType) -> String? {
switch weather {
case .Sun:
return nil
case .Cloud, .Wind:
return "dislike"
case .Rain:
return "hate"
}
//这段代码不会成功编译,应该添加 case .Snow 或是 default case。
}
~~~
对于 Enum,Swift 还有一个非常强大的特性:可以为组中的值再附加一个值,进一步细分:
~~~
enum WeatherType {
case Sun
case Cloud
case Rain
case Wind(speed: Int)
case Snow
}
~~~
如此,使用 switch/case 时就有了额外的条件,当条件都满足时 case 才会匹配:
~~~
func getHaterStatus(weather: WeatherType) -> String? {
switch weather {
case .Sun:
return nil
case .Wind(let speed) where speed < 10: //meh
return "meh"
case .Cloud, .Wind:
return "dislike"
case .Rain, .Snow:
return "hate"
}
}
getHaterStatus(WeatherType.Wind(speed: 5))
~~~
代码段第五行的 let 关键字的用途是声明一个能引用的常量名保存传入的参数,通过 Where 关键字来声明条件。
Swift 从上至下判断 switch/case 语句,所以请注意 case 的排序。