在类型中找不到枚举案例

man*_*mku 5 enums swift

enum Operator: Character {
    case Substract = "-"
    case Add = "+"
    case Multiply = "*"
    case Divide = "/"
}
Run Code Online (Sandbox Code Playgroud)

我有上面的枚举和下面声明的函数,它检查我们是否有有效的运算符.例如isOperator("+")

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

这里的编译器返回的是"在类型中找不到枚举的情况"意味着在我的switch语句中定义的情况(.Add .. etc)在运算符类型中不可用.为什么编译器无法找到大小写,因为op是一个运算符类型,其中swift inver类型是atuomatically?

Jay*_*eep 15

是的,因为你let op = Operator(rawValue: symbol)就是optionalswitch情况下,你是匹配的精确值.所以你可以optionalcase比较时申请.如下所示.

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


Adr*_*ski 5

你只有4种情况就可以

func isOperator(_ symbol: Character)-> Operator? {
    return Operator(rawValue: symbol)
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您将来会拥有更多,那么最好在使用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

        ...

    }
}
Run Code Online (Sandbox Code Playgroud)
  • 在swift的最新版本swift 3中,枚举的命名约定已更改。每个枚举案例都遵循camelCase规则。

  • 当您使用类似的函数名称时,此函数应返回isSomethingBool