如果模式匹配多个案例怎么办?

时间:2016-09-05 15:28:13

标签: swift

我正在搜索if语句中与多个case进行模式匹配的语法。 例如:

enum Gender {
    case Male, Female, Transgender
}

let a = Gender.Male

现在我想检查,如果是.Male或.Female。但我想避免使用开关。但是switch语句是这样的:

switch a {
case .Male, .Female:
    // do something
}

如果是这样的话可以写这个吗? 我希望如此,但它没有用:(

if case .Male, .Female = a {

}

4 个答案:

答案 0 :(得分:12)

一个简单的数组可以解决这个问题:

if [.Male, .Female].contains(a) {
    print("Male or female")
} else {
    print("Transgender")
}

我对Swift推断类型的能力感到惊讶。在此处,.Male.Female属于a类型的性别。

答案 1 :(得分:1)

如果你有一个关联的值,你可以像这样简单地创建一个 Bool 变量

extension Gender {

var isMaleOrFemale: Bool {
    switch self {
    case .Male, .Female:
        return true
    default:
        return false
    }
}

和用法:

if a.isMaleOrFemale { 
// Your code here
}

答案 2 :(得分:0)

对于模式匹配,您描述的内容尚不可用。你可以在你的情况下这样做。但如果它无法转换为hashValue。那么这也行不通。

// Using Pattern Matching for more than one case.
if case 0...2 = a.hashValue {
    print("Hello")
}

//Normal if else
if a == .Male || a == .Female {
    print("Hello")
}

答案 3 :(得分:0)

你应该使用一个集合。在JavaScript中我会写这样的东西:

if ([Gender.Male, Gender.Female].includes(actualGender))
    console.log(actualGender);

请注意,我对swift没有任何线索,或者在该语言中如何做同样的事情,所以这里有一个相关的答案:https://stackoverflow.com/a/25391725/607033:D

编辑:这是Swift版本:

if [.Male, .Female].contains(a) {

}