Swift入门-简洁版(3 / 3)

342 阅读1分钟

原视频:www.bilibili.com/video/BV1uZ…

Swift入门-简洁版(1 / 3)

Swift入门-简洁版(2 / 3)

Swift入门-简洁版(3 / 3)

二十三、枚举

  • 枚举的基本用法

image.png

  • 关联值(Associated Values)

    • 有时会将枚举的成员值跟其他类型的关联存储在一起,会非常有用

      enum Score
      {
        case points(Int)
        case grade(Character)
      }
      
      var score = Score.points(96)
      score = .grade("A")
      
      switch score 
      {
        case let .points(i):
        	print(i, "points")
        case let .grade(i):
        	print("grade", i)
      } // grade A
      
      enum Date 
      {
        case digit(year: Int, month: Int, day: Int)
        case string(String)
      }
      var date = Date.digit(year: 2011, month: 9, day: 10)
      date = .string("2011-09-10")
      switch date
      {
        case .digit(let year, let month, let day):
        	print(year, month, day)
        case let .string(value):
        	print(value)
      }
      

      必要时let也可以改为var

    • 关联值举例:

      image.png

      enum Password 
      {
        case number(Int, Int, Int, Int)
        case gesture(String)
      }
      
      var pwd = Password.number(3,5,7,8)
      pwd = .gesture("12369")
      
      switch pwd 
      {
        case let .number(n1, n2 ,n3 ,n4):
        	print("number is ",n1 ,n2 ,n3 ,n4)
        case let .gesture(str):
         print("gesture is", str)
      }
      
  • 原始值(Raw Values)

    枚举成员可以使用相同类型的默认值预先关联,这个默认值叫做:原始值

    enum PokerSuit : Character
    {
      case spade = "♠"
      case heart = "❤"
      case diamond = "♦"
      case club = "♣"
    }
    
    var suit = PokerSuit.spade
    print(suit) // spade
    print(suit.rawValue) // ♠
    print(PokerSuit.club.rawValue) // ♣
    
  • 隐式原始值(Implicitly Assigned Raw Values)

    如果枚举的原始值类型是Int、String Swift会自动分配原始值

    image.png

  • 递归枚举(Recursive Enumeration)

    image.png

  • MemoryLayout

    可以使用MemoryLayout获取数据类型占用的内存大小

    MemoryLayout<Int>.size // 8 实际用到的空间大小
    MemoryLayout<Int>.stride // 8 分配占用的空间大小
    MemoryLayout<Int>.aligment // 内存对齐 8
    
    var age = 10
    MemoryLayout.size(ofValue: age) // 8
    MemoryLayout.stride(ofValue: age) // 8
    MemoryLayout.aligment(ofValue: age) // 内存对齐 8
    
  • 关联值和原始值在内存分配上是有区别的

    • 原始值是固定死的
    • 关联值需看具体类型

二十四、内存分析

思考下面枚举变量的内存布局

image.png