Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何在多个情况下进行模式匹配?_Swift - Fatal编程技术网

Swift 如何在多个情况下进行模式匹配?

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

我正在搜索用于在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].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之外的开关大小写。