8. Swift 枚举 Enum.png

枚举是一组有共同特性的数据的集合,只包含自定义的特定数据

创建枚举

  1. enum Sex {
  2. case Male
  3. case Female
  4. case Unknown
  5. }
  6. var ss = Sex.Unknown
  7. ss = .Female
  8. switch ss {
  9. case .Male:
  10. print("男性")
  11. break
  12. case .Female:
  13. print("女性")
  14. break
  15. case .Unknown:
  16. print("未知")
  17. break
  18. }

枚举可分为相关值与原始值

关联值

也称“相关值”,由不同数据类型组成,比如 enum {10, 0.8, “Hello”},它的值的创建基于常量或变量。
当你在创建一个基于枚举成员的新常量或变量时才会被设置,并且每次当你这么做得时候,它的值可以是不同的。

  1. enum Student {
  2. case Name(String) // 可省略参数名
  3. case Score(chinese: Int, math: Int, english: Int)
  4. }
  5. var stu1 = Student.Name("Jobs")
  6. var stu2 = Student.Score(chinese: 98, math: 97, english: 99)
  7. switch stu2 {
  8. case .Name(let name):
  9. print("name is \(name)")
  10. case .Score(let chinese, let math, let english):
  11. print("score are \(chinese), \(math), \(english)")
  12. }

原始值

由相同数据类型组成,比如 enum {10,35,50},它的值的创建基于预先填充的值,是常量。

枚举值类型可为:整型、浮点型、字符串、布尔值

  1. enum Move: Int {
  2. case left = 0
  3. case right = 1
  4. case top = 2
  5. case bottom = 3
  6. }

在原始值为整数的枚举时,不需要显式的为每一个成员赋值,Swift 会自增为你赋值,默认从 0 开始自增。

  1. enum Month: Int {
  2. case January = 1,
  3. February, March, April, May, June, July, August, September, October, November, December
  4. }
  5. print("Month is \(Month.September.rawValue)")

如果使用原始值类型定义枚举,则枚举会自动接收一个带有原始值的初始化器,并返回可选类型的枚举实例。
使用枚举的 rawValue 属性来访问其原始值。

  1. enum MethodType: String {
  2. case GET = "get"
  3. case POST = "post"
  4. case PUT
  5. }
  6. print(MethodType.GET.rawValue) // "get"
  7. print(MethodType.PUT.rawValue) // "PUT"
  8. let type = MethodType(rawValue: "post")
  9. print(type!) // POST

高级用法

嵌套枚举

  1. enum Area {
  2. case BeiJing
  3. case ShangHai
  4. enum JiangSu {
  5. case NanJing
  6. case SuZhou
  7. case WuXi
  8. }
  9. }
  10. print(Area.JiangSu.SuZhou)

以下内容超纲,可以之后再回过来看

方法和属性

  1. enum Device {
  2. case iPad, iPhone, AppleTV, AppleWatch
  3. /**
  4. 计算属性
  5. 增加一个存储属性到枚举中不被允许,但你依然能够创建计算属性。
  6. 当然,计算属性的内容都是建立在枚举值下或者枚举关联值得到的。
  7. */
  8. var productName: String {
  9. switch self {
  10. case .iPad: return "iPad"
  11. case .iPhone: return "iPhone"
  12. case .AppleWatch: return "AppleWatch"
  13. case .AppleTV: return "AppleTV"
  14. }
  15. }
  16. // 方法
  17. func description() -> String {
  18. switch self {
  19. case .iPad: return "iPad"
  20. case .iPhone: return "iPhone"
  21. case .AppleWatch: return "AppleWatch"
  22. case .AppleTV: return "AppleTV"
  23. }
  24. }
  25. // 静态方法
  26. static func getTypeWithName(name: String) -> Device? {
  27. if name == "iWatch" {
  28. return .AppleWatch
  29. }
  30. return nil
  31. }
  32. }
  33. let device = Device.iPhone
  34. print(device.productName)
  35. print(device.description())
  36. print(Device.getTypeWithName(name: "iWatch")!)
  1. enum Rotate: Int {
  2. case Top
  3. case Right
  4. case Bottom
  5. case Left
  6. /**
  7. enum 中可以定义可变方法,这样就可以更改 self 的值
  8. */
  9. mutating func next() {
  10. switch self {
  11. case .Top:
  12. self = .Right
  13. case .Right:
  14. self = .Bottom
  15. case .Bottom:
  16. self = .Left
  17. case .Left:
  18. self = .Top
  19. }
  20. }
  21. }

协议

  1. protocol PrintProtocol {
  2. var description: String? { get }
  3. }
  4. enum Trade: PrintProtocol {
  5. case Buy(stock: String, amount: Int)
  6. case Sell(stock: String, amount: Int)
  7. var description: String? {
  8. switch self {
  9. case .Buy(_, _):
  10. return "Trade.Buy..."
  11. case .Sell(_, _):
  12. return "Trade.Sell..."
  13. }
  14. return nil
  15. }
  16. }
  17. let trade = Trade.Buy(stock: "car", amount: 1)
  18. print(trade.description!)

扩展

  1. protocol PrintProtocol {
  2. var description: String? { get }
  3. }
  4. enum Trade {
  5. case Buy(stock: String, amount: Int)
  6. case Sell(stock: String, amount: Int)
  7. }
  8. extension Trade: PrintProtocol {
  9. var description: String? {
  10. switch self {
  11. case .Buy(_, _):
  12. return "Trade.Buy..."
  13. case .Sell(_, _):
  14. return "Trade.Sell..."
  15. }
  16. return nil
  17. }
  18. }
  19. let trade = Trade.Buy(stock: "car", amount: 1)
  20. print(trade.description!)

泛型

  1. enum Product<T> {
  2. case price(T)
  3. func getPrice() -> T {
  4. switch self {
  5. case .price(let value):
  6. return value
  7. }
  8. }
  9. }
  10. let prod = Product<Int>.price(100)
  11. print(prod.getPrice())

备注:[枚举]