如何将开关与枚举一起用于字符串

use*_*240 5 swift

对不起,这个非常基本的问题,但我想弄清楚如何使用 switch 语句来检查它是否是某个字符串。

例如,如果我有一个 AnimalType 枚举,然后我有一个动物结构:

enum AnimalType: String {
   case Mammal = "Mammal"
   case Reptile = "Reptile"
   case Fish = "Fish"
}

struct Animal {
   let name: String
   let type: String
}
Run Code Online (Sandbox Code Playgroud)

如果我想查看一个 Animals 列表然后有一个 switch 语句,我将如何将 Animal.Type 字符串与枚举匹配?我也不想将 Animal 结构更改为让 type: AnimalType 。

switch Animal.type {
case :
...// how do I match the string to the enum?
Run Code Online (Sandbox Code Playgroud)

Fer*_*yan 7

enum Command: String {
   case Mammal = "Mammal"
   case Reptile = "Reptile"
   case Fish = "Fish"
}

let command = Command(rawValue: "d")

switch command {
case .Mammal?:
    print("Mammal")
case .Reptile?:
    print("second")
case .Fish?:
    print("third")
case nil:
    print("not found")
}
// prints "not found"
Run Code Online (Sandbox Code Playgroud)


Gla*_*phi 7

您可以从字符串 rawValue 创建一个动物类型并打开它:但首先我会将大小写更改为小写,这是 Swift 中的首选样式。

func checkType(of animal: Animal) {
    guard let animalType = AnimalType(rawValue: animal.type) else {
        print("Not an animal type")
        return
    }
    switch animalType {
    case .mammal: break
    case .reptile: break
    case .fish: break
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您也可以打开字符串并比较它是否与您的任何 AnimalType rawValues 匹配:

func checkType(of animal: Animal) {
    switch animal.type {
    case AnimalType.mammal.rawValue: break
    case AnimalType.reptile.rawValue: break
    case AnimalType.fish.rawValue: break
    default:
        print("Not an animal type")
        break
    }
}
Run Code Online (Sandbox Code Playgroud)