Swift枚举详解2

182 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情

在枚举变量初始化时,开发者可以使用枚举类型加点语法的方式,如果这个枚举有指定的原始值,也可以通过枚举值的原始值来完成枚举实例的构造,示例如下:

enum IntEnum: Int {
    ///第一个枚举值的原始值设置为1
    case a = 1
    ///默认原始值为2
    case b
    ///默认原始值为3
    case c
    ///默认原始值为4
    case d
}

///通过原始值构造枚举变量a
var intEnum = IntEnum(rawValue: 1)

需要注意,通过原始值进行枚举实例的构造时,是有可能构造失败的,因为开发者传入的原始值不一定会对应某一个枚举值。因此,这个方法实际上返回的是一个Optional类型的可选值,如果构造失败,则会返回nil。

枚举的相关值

在定义枚举值的时候,开发者可以为其设置一个参数列表,这个参数列表被称为枚举的相关值。示例如下:

///定义形状枚举
enum Shape {
    ///圆形,设置圆心和半径为相关值
    case circle(center: (Double, Double), radius: Double)
    ///矩形,设置中心,宽高为相关值
    case rect(center: (Double, Double), width: Double, height: Double)
    ///三角形,设置三个顶点为相关值
    case triangle(point1: (Double, Double), point2: (Double, Double), point3: (Double, Double))
}

在创建相关值枚举的时候,开发者需要提供参数列表中所需要的参数,示例如下:

省略......
///创建圆形,圆心为(0, 0),半径为3
var circle = Shape.circle(center: (0, 0), radius: 3)
///创建矩形,中心点为(1, 1), 宽度为10,高度为15
var rect = Shape.rect(center: (1, 1), width: 10, height: 15)
///创建三角形,顶点为(2, 2), (3, 3), (2, 5)
var triangle = Shape.triangle(point1: (2, 2), point2: (3, 3), point3: (2, 5))

模式匹配

在switch-case结构语句中,匹配到枚举后,可以通过参数捕获的方式来获取枚举实例的相关值,这里捕获到的相关值参数可以在开发者的代码中使用,示例如下:

///定义形状枚举
enum Shape {
    ///圆形,设置圆心和半径为相关值
    case circle(center: (Double, Double), radius: Double)
    ///矩形,设置中心,宽高为相关值
    case rect(center: (Double, Double), width: Double, height: Double)
    ///三角形,设置三个顶点为相关值
    case triangle(point1: (Double, Double), point2: (Double, Double), point3: (Double, Double))
}

///创建圆形,圆心为(0, 0),半径为3
var circle = Shape.circle(center: (0, 0), radius: 3)
///创建矩形,中心点为(1, 1), 宽度为10,高度为15
var rect = Shape.rect(center: (1, 1), width: 10, height: 15)
///创建三角形,顶点为(2, 2), (3, 3), (2, 5)
var triangle = Shape.triangle(point1: (2, 2), point2: (3, 3), point3: (2, 5))

func ShapeFunc(param: Shape) {
    switch param {
    case let .circle(center, radius):
        print("此圆的圆心为:(center),半径为:(radius)")
    case let .rect(center, width, height):
        print("此矩形的中心为:(center),宽为:(width),高为:(height)")
    case let .triangle(point1, point2, point3):
        print("此三角形的3个顶点为:(point1),(point2),(point3)")
    }
}

ShapeFunc(param: circle)
ShapeFunc(param: rect)
ShapeFunc(param: triangle)