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
规则。当您使用函数名称(如
is
Something
(时,此函数应返回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"
}