一尘不染

Swift开关模式与数组匹配

swift

想知道是否有一种方法可以在Swift中执行以下操作。

let foo = [1, 2, 3]
let bar = [4, 5, 6]

let value = 5

switch value {
case in foo
    print("5 is in foo")
case in bar
    print("5 is in bar")
default:
    break
}

我知道我还有其他方法可以使这个人为的示例工作,例如case 4, 5, 6:是否使用开关,而是使用开关,bar.contains(value)但是我正在寻找一种解决方案,具体涉及将开关模式匹配到阵列。谢谢!


阅读 194

收藏
2020-07-07

共1个答案

一尘不染

您可以定义一个自定义模式匹配运算符~=,该运算符 将一个数组作为“模式”和一个值:

func ~=<T : Equatable>(array: [T], value: T) -> Bool {
    return array.contains(value)
}

let foo = [1, 2, 3]
let bar = [4, 5, 6]

let value = 5

switch value {
case foo:
    print("\(value) is in foo")
case bar:
    print("\(value) is in bar")
default:
    break
}

类似的运算符已经存在,例如间隔:

public func ~=<I : IntervalType>(pattern: I, value: I.Bound) -> Bool
2020-07-07