swift学习笔记 -- Enumerations

一.枚举语法

    enum 枚举名{

      case:枚举名

      case:枚举名

      case:枚举名

      .......
   }

  enum CompassPoint {

    case north

    case south

    case east

    case west

  }

  var directionToHead = CompassPoint.west

directionToHead被初始化的时候,它被推测成CompassPoint类型,当我们想再次改变directionToHead的值时候可以直接:

  1. directionToHead = .east

  2. 二.用 Switch 匹配枚举值
  3. 用 switch 来匹配一个枚举值的时候,其中的 case 语句必须完全覆盖枚举里的值
  4. switch directionToHead {

    case .north:

        print("Lots of planets have a north")

    case .south:

        print("Watch out for penguins")

    case .east:

        print("Where the sun rises")

    case .west:

        print("Where the skies are blue")

    }

    如果省略其中一个 case 将会出错

    当然还有一种方法是,我们可以添加 default 字段,通过这种方式我们可以省略 case

    let somePlanet = Planet.earth

    switch somePlanet {

    case .earth:

        print("Mostly harmless")

    default:

        print("Not a safe place for humans")

    }


    三.枚举的关联值

    每个枚举项都可以带一个关联值。

    enum Barcode {

      case upc(Int, Int, Int, Int)

      case qrCode(String)

    }

    varproductBarcode = Barcode.upc(8,85909,51226,3)

    productBarcode = .qrCode("ABCDEFGHIJKLMNOP")


    带关联值的 switch 语句

    switch productBarcode {

    case .upc(let numberSystem,let manufacturer,let product, let check):

        print("UPC: \(numberSystem),\(manufacturer),\(product),\(check).")

    case .qrCode(let productCode):

        print("QR code: \(productCode).")

    }

    如果关联值的类型(let、var)都相同我们可以只在最前面写个类型

    switch productBarcode {

    caselet.upc( numberSystem,manufacturer,product, check):

        print("UPC: \(numberSystem),\(manufacturer),\(product),\(check).")

    case let.qrCode(productCode):

        print("QR code: \(productCode).")

    }


    四.行值

    枚举可以设置默认值的,但是这些默认值的类型必须相同,这是和关联值的不同地方。因此必须显示的定义枚举的类型

    enum ASCIIControlCharacter:Character {

        case tab ="1"

        case lineFeed ="2"

        case carriageReturn ="3"

    }

    设置了行值就不能设置关联值。

    当你的枚举类型是数字和字符串的时候,我们可以不显示定义每个 case 的值

    如果存储的是数字的话,第一个 case 如果没有赋值的话默认为0,其他的 case 为前面的 case 值加1

    enum Planet: Int {

        case mercury =1, venus, earth, mars, jupiter, saturn, uranus, neptune

    }


    如果存储的是字符串的话,case 的行值,默认为 case 的名字。

    enum CompassPoint:String {

        case north, south, east, west

    }


    如果一个枚举是一个行值类型,那么它会自动的接受一个初始化器,通过这个初始化器,我们可以通过 case 所在的行数,来获取 case 的值。这个初始化器接受一个 Int 值,这个 Int 值有可能超过 case 的行数,因此初始化器返回一个可选值。

    let positionToFind =11

    if let somePlanet = Planet(rawValue:positionToFind) {

        switch somePlanet {

        case .earth:

            print("Mostly harmless")

        default:

            print("Not a safe place for humans")

        }

    } else {

        print("There isn't a planet at position\(positionToFind)")

    }

    // Prints "There isn't a planet at position 11"


    五.递归枚举

    一个递归枚举是由另一个枚举作为 case 的关联值。你可以在 case 前面加上 indirect,来告诉编译器为递归插入必要的层。

    enum ArithmeticExpression {

        case number(Int)

        indirectcase addition(ArithmeticExpression, ArithmeticExpression)

        indirectcase multiplication(ArithmeticExpression, ArithmeticExpression)

    }

    我们也可以在enum 关键词前加上indirect,来表明全被 case 支持递归。

    indirect enum ArithmeticExpression {

        case number(Int)

        case addition(ArithmeticExpression, ArithmeticExpression)

        case multiplication(ArithmeticExpression, ArithmeticExpression)

    }
















你可能感兴趣的:(swift,swift)