在类型中找不到枚举案例

时间:2017-08-20 05:18:34

标签: swift enums

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?

3 个答案:

答案 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"
}