Swift 如何在多个情况下进行模式匹配?
我正在搜索用于在if case语句中对多个case进行模式匹配的语法。 例如:Swift 如何在多个情况下进行模式匹配?,swift,Swift,我正在搜索用于在if case语句中对多个case进行模式匹配的语法。 例如: enum Gender { case Male, Female, Transgender } let a = Gender.Male 现在我想检查a是男性还是女性。但我想避免使用这个开关。但是,switch语句如下所示: switch a { case .Male, .Female: // do something } if ([Gender.Male, Gender.Female].inclu
enum Gender {
case Male, Female, Transgender
}
let a = Gender.Male
现在我想检查a是男性还是女性。但我想避免使用这个开关。但是,switch语句如下所示:
switch a {
case .Male, .Female:
// do something
}
if ([Gender.Male, Gender.Female].includes(actualGender))
console.log(actualGender);
可以用if-case写这个吗?
我本以为会这样,但没用:(
对于模式匹配,您所描述的还不起作用。您可以在本例中这样做。但如果无法将其转换为
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")
}
您应该使用集合。在JavaScript中,我将编写如下内容:
switch a {
case .Male, .Female:
// do something
}
if ([Gender.Male, Gender.Female].includes(actualGender))
console.log(actualGender);
请注意,我对swift一无所知,也不知道如何使用该语言进行同样的操作,因此这里是主题::D中的一个相关答案
编辑:这是Swift版本:
if [.Male, .Female].contains(a) {
}
一个简单的数组就可以做到这一点:
if [.Male, .Female].contains(a) {
print("Male or female")
} else {
print("Transgender")
}
我对斯威夫特推断类型的能力感到惊讶。在这里,它得到了
。男性和。女性是a
中的性别类型。如果你有一个关联的值,你可以简单地创建一个像这样的Bool变量
extension Gender {
var isMaleOrFemale: Bool {
switch self {
case .Male, .Female:
return true
default:
return false
}
}
使用方法:
if a.isMaleOrFemale {
// Your code here
}
是的,这会起作用,但没有模式匹配。假设我要检查两个以上的案例。没有用于此目的的语法吗?噢,对不起,我读错了。据我所知,没有与您描述的模式匹配。但是有一个使用hashValue
的模式可以用于您的案例。我将更新我的答案。在这种情况下,我不认为hashValue是一个选项。如果还没有语法,也许我应该写一个建议:)啊,好的,我明白你的意思了。这不是一个选项,因为枚举不映射到Int(也不应该映射到Int)。注意==
仅当枚举
是相等的
时才起作用,否则,原始问题中描述的switch
语句是正确的方法。您应该使用js中的集合。我会这样写:if([Gender.Male,Gender.Female]。includes(actualGender))
。据我所知,这是不可能的。我不久前创建的。这仅在枚举是equalable
时有效。任何情况下都有关联值的枚举如果不手动实现,则不可用。@rgeorge如果需要更多的函数,则始终可以编写该函数。@rgeorge True该枚举必须是相等的
-但不需要手动实现。如果所有关联的值类型也都是Equatable
,则具有关联值的枚举可以自动获得Equatable
的实现。您所需要做的就是在enum的声明中写入一致性:enum Gender:Equatable{
*请注意,只有在enum的初始声明中声明一致性,而不是在扩展中声明一致性,才能获得自动实现。这看起来是正确的解决方案,因为我们避免了enum之外的开关大小写。