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

Ben*_*Ben 14 swift

我在if case语句中搜索与多个case进行模式匹配的语法.这个例子是这样的:

enum Gender {
    case Male, Female, Transgender
}

let a = Gender.Male
Run Code Online (Sandbox Code Playgroud)

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

switch a {
case .Male, .Female:
    // do something
}
Run Code Online (Sandbox Code Playgroud)

如果是这样的话可以写这个吗?我会期待这一点,但它不起作用:(

if case .Male, .Female = a {

}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ent 14

一个简单的数组就可以了:

if [.Male, .Female].contains(a) {
    print("Male or female")
} else {
    print("Transgender")
}
Run Code Online (Sandbox Code Playgroud)

我对Swift推断类型的能力感到惊讶.在这里,它得到了.Male并且.Female属于性别类型a.

  • 这只有在枚举为"Equatable"时才有效.没有手动实现的情况下,任何情况下都没有相关值的枚举. (6认同)
  • @rgeorge确实,枚举必须是“平等的”-但是,不需要手动执行。如果所有关联值类型也都是“等于”,则具有关联值的枚举可以自动获得“等于”的实现。您需要做的就是在该枚举的声明中写出一致性:`enum Gender:Equatable {`。*请注意,只有在枚举的初始声明中而不在扩展名中声明一致性时,才会获得自动实现 (2认同)

Zac*_*wan 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")
}
Run Code Online (Sandbox Code Playgroud)