当前位置: 代码迷 >> 综合 >> Day:14:枚举
  详细解决方案

Day:14:枚举

热度:40   发布时间:2023-09-29 19:03:25.0
  • Object-C 面向对象的特性
  1. 继承
  2. 封装
  3. 多态
  • swift 基本单元
  1. 枚举
  2. 结构体
  3. 协议
  4. 扩展
  • 面向对象概述
  1. 从整体的功能上看swift的枚举、结构体、类三者具有完全平等的地位。
  2. swift的类,结构体,枚举中都可以定义(属性、方法、下标、构造体、嵌套类型)
  3. 在swift中,枚举和结构体是值类型、类属于引用类型。
  • 类和结构体相似点
  1. 定义属性用来存储值
  2. 定义方法用于提供功能
  3. 定义下标脚本用来允许使用下标语法访问值
  4. 定义初始化器用于初始化状态
  5. 可以被扩展来默认所没有的功能
  6. 遵循协议来针对特定类型提供标准功能
  • 类和结构体不同点
  1. 继承允许一个类继承另一个类的特征。
  2. 类型转换允许你在运行检查和解释一个类实例的类型。
  3. 反初始化器允许一个类实例释放任何其所能被分配的资源。
  4. 引用技计数允许不止一个对类实例的引用。
  • 枚举语法
  1. 用enum关键字来定义一个枚举,然后将其所有的定义内容在一个大括号({})中。
  2. 多个成员值可以出现在同一个行中,要逗号隔开。
  3. 每个枚举都定义了一个全新的类型。正如swift中其他的类型那样,它们的名称(例如CompassPoint和Planet)需要首字母大写。给枚举类型一个单数的而不是复数的名字,从而使得它们能够顾名思义。
  • 使用switch语句来匹配枚举值
  1. 你可以用switch语句来匹配每一个单独的枚举值。
  • 遍历枚举的case
  1. 对于某些枚举来说,如果能有一个集合包含了枚举的所有情况就好了。你可以通过在枚举名字后面写:Caseilterable来允许枚举被遍历。swift会暴露一个包含对应枚举类型所有情况的集合名为allCase。
  • 关联值
  1. 可以定义swift枚举来存储任何给定类型的关联值,如果需要的话不同关联值的类型可以不同。
  • 原始值
  1. 枚举成员可以用相同类型的默认值预先填充(称为原始值)。
  • 预设原始值
  1. 当你在操作存储整数或者字符串枚举的时候,你不必显式地给每一个成员都分配一个原始值。当你没有分配式,swift将会自动为你分配值。
  • 从原始值初始化
  1. 如果你用原始值类型定义一个枚举,那么枚举就会自动收到一个可以接受原始值类型的值的初始化器(叫做rawValue的形式参数)然后返回一个枚举成员或者nil。你可以使用这个初始化器来尝试创建一个枚举的新实例。
  • 递归枚举
  1. 递归枚举是拥有另一个枚举作为枚举成员关联值的枚举。当编译器操作递归枚举时必须插入间接寻址层。你可以在声明枚举成员之前使用indirect关键字来明确它是递归的。如说表达式(5+4)*2 在乘法右侧有一个数但有其他表达式在乘法的左侧。
  • 【代码演示】
    import UIKit//1、枚举语法
    enum CompassPoint {case northcase southcase esatcase west
    }enum Planet {case merury,veus,earth,mars,jupiter,saturn,uranus,neptune
    }//2、switch 语句匹配枚举值let directionToHead = CompassPoint.southswitch directionToHead {
    case .north:print("north...")
    case .south:print("south")//结果:south
    case .esat:print("east")
    case .west:print("west")
    }//3、遍历enum Colors:CaseIterable {case yellowcase graycase redcase blackcase white
    }let colorsOfCount = Colors.allCases.count
    print("colors.count \(colorsOfCount)")//结果:colors.count 5for color in Colors.allCases{
    print(color)//结果:yellow gray red black white
    }
    //4、关联值
    enum Barcode {case upc(Int,Int,Int,Int)case qrCode(String)
    }var productBarcode = Barcode.upc(8, 55909, 51226, 3)
    print(productBarcode)//结果:upc(8, 55909, 51226, 3)
    productBarcode = .qrCode("ABCDFET")
    print(productBarcode)//结果:qrCode("ABCDFET")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)")//结果:QR code:ABCDFET
    }//5、原始值
    enum ASSCIIControlCharacter:Character {case tab = "\t"case lineFeed = "\n"case carriageRetunr = "r"
    }//6、预设原始值
    enum names:String  {case zhangsan,lisi,wangwu,zhaoliu
    }enum age:Int  {case zhangsan = 23,lisi,wangwu,zhaoliu
    }
    //7、递归枚举
    indirect enum ArithmeticExpression {case number(Int)case add(ArithmeticExpression,ArithmeticExpression)case mutiply(ArithmeticExpression,ArithmeticExpression)
    }let firstExpression = ArithmeticExpression.number(5)
    let secondExpression = ArithmeticExpression.number(4)
    let addExpression = ArithmeticExpression.add(firstExpression, secondExpression)
    let thirdExpression =  ArithmeticExpression.number(2)
    let mutiplyExpression =
    ArithmeticExpression.mutiply(addExpression, thirdExpression)
    print(mutiplyExpression)func eval(_ expresson:ArithmeticExpression) ->Int{switch expresson {case .number(let value):return valuecase .add(let num1, let num2):return eval(num1) + eval(num2)case .mutiply(let num1, let num2):return eval(num1) * eval(num2)}}print(eval(mutiplyExpression))

  相关解决方案