enum Operator: Character {
case Substract = "-"
case Add = "+"
case Multiply = "*"
case Divide = "/"
}
我上面有枚举,下面声明了一个函数,检查我们是否有有效的运算符。例如的 isOperator(" +&#34)
func isOperator(_ symbol: Character)-> Operator? {
let op = Operator(rawValue: symbol)
switch op {
case .Substract, .Add, .Multiply, .Divide:
return op
default:
return nil
}
}
这里返回的是"未在类型&#34中找到Enum Case; 表示在我的switch语句中定义的情况(.Add .. etc)在运算符类型中不可用。为什么编译器无法找到大小写,因为 op 是一个操作符类型,其中swift inver类型是atuomatically?
答案 0 :(得分:10)
是的,因为您的let op = Operator(rawValue: symbol)
是optional
,而switch
情况下您的确切值是匹配的。因此,您可以在比较时在optional
中应用case
。如下所示。
func isOperator(_ symbol: Character)-> Operator? {
let op = Operator(rawValue: symbol)
switch op {
case .Substract?, .Add?, .Multiply?, .Divide?:
return op
default:
return nil
}
}
答案 1 :(得分:4)
你只有4个案例,你可以
func isOperator(_ symbol: Character)-> Operator? {
return Operator(rawValue: symbol)
}
但如果您将来有更多内容,那么最好在guard
之前使用switch
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
答案 2 :(得分:2)
以小写字母开头命名案例是Swift惯例:
enum Operator: Character {
case subtract = "-", add = "+", multiply = "*", divide = "/"
}
如果要检查它是否是有效的运算符,则函数应返回Bool。您可以扩展Character并创建一个只读的计算属性,如下所示:
extension Character {
var isOperator: Bool {
return Operator(rawValue: self) != nil
}
}
测试
Character("/").isOperator // true
if let op = Operator(rawValue: "-") {
print(op) // "subtract\n"
}