swift enum在单个switch-case中获取具有相同参数的多个case的关联值

Vin*_*Sit 3 ios swift

这是一个带有相关值的常见枚举.

enum MultiplierType {
    case width(Double)
    case height(Double)
    case xxxxx1(Double)
    case xxxxx2(Double)
    case xxxxx3(Double)

    var value: Double {
        switch self {
            // Normal way.
            case let .width(value):
                return value
            case let .height(value):
                return value
            case let .xxxxx1(value):
                return value
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何做到这一点?

var value: Double {
    switch self {
    // How to get the value in one case?
    case let .width(value), .height(value), .xxx:
         return value
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

var value: Double {
    switch self {
    // How to get the value in one case?
    case let .width, .height, .xxx (value):
         return value
    }
}
Run Code Online (Sandbox Code Playgroud)

获得相关价值的最优雅方式是什么?

vac*_*ama 13

您可以将多个枚举值放在同一case行中,但您必须将其let移入():

var value: Double {
    switch self {
    case .width(let value), .height(let value), .xxxxx1(let value):
         return value
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能希望将每个enum值放在单独的行上:

var value: Double {
    switch self {
    case .width(let value),
         .height(let value),
         .xxxxx1(let value):
         return value
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这与enum使用相关值的s 一样优雅.没有明确列出enums ,就无法获得相关值.

您只能组合具有相同类型的关联值的同一行中的值,并且所有值都必须绑定到相同的变量名称.这样,在下面的代码中,您知道value绑定以及它的类型是什么,无论哪个enum模式匹配.

  • 有必要使用模式匹配来提取枚举案例的关联值。“default”是一个关键字,而不是一个模式。也许 Swift 可以扩展以实现“case _(let value)”来匹配具有一个关联值的任何值,但目前它还没有这样做。不过,这是一个有趣的想法。 (2认同)