在类型中找不到枚举大小写


enum Operator: Character {
case Substract = "-"
case Add = "+"
case Multiply = "*"
case Divide = "/"
}

我在上面有一个枚举,下面声明了一个函数,用于检查我们是否有有效的运算符。 例如isOperator("+"(

func isOperator(_ symbol: Character)-> Operator? {        
let op = Operator(rawValue: symbol)       
switch op {
case .Substract, .Add, .Multiply, .Divide:
return op
default:
return nil
}
}

编译器在这里返回的是"在类型中找不到枚举大小写">是指在我的 switch 语句中定义的情况 (.加。。等(在操作员类型中不可用。为什么编译器找不到大小写,因为op是一种运算符类型,它 swift inver 自动类型?

是的,因为您的let op = Operator(rawValue: symbol)optional,并且在switch情况下,您匹配的是精确的值。因此,您可以在比较时case应用optional。如下所示。

func isOperator(_ symbol: Character)-> Operator? {
let op = Operator(rawValue: symbol)
switch op {
case .Substract?, .Add?, .Multiply?, .Divide?:
return op
default:
return nil
}
}

你只有 4 个案例,那么你可以

func isOperator(_ symbol: Character)-> Operator? {
return Operator(rawValue: symbol)
}

但是,如果您将来要拥有更多,那么最好在switch之前使用guard

func isOperator(_ symbol: Character)-> Operator? {
guard let op = Operator(rawValue: symbol) else {
return nil
}
switch op {
case .Substract, .Add, .Multiply, .Divide:
return op
...
}
}

  • 在最新版本的 swift swift 3 中,枚举的命名约定发生了变化。每个枚举案例都遵循camelCase规则。

  • 当您使用函数名称(如isSomething(时,此函数应返回Bool

Swift 的惯例是以小写字母开头命名您的案例:

enum Operator: Character {
case subtract = "-", add = "+", multiply = "*", divide = "/"
}

如果你想检查它是否是一个有效的运算符,你的函数应该返回布尔值。可以扩展 Character 并创建只读计算属性,如下所示:

extension Character {
var isOperator: Bool {
return Operator(rawValue: self) != nil
}
}

测试

Character("/").isOperator   // true
if let op = Operator(rawValue: "-") {
print(op) // "subtractn"
}

最新更新