为什么`案例自我> 0:在switch语句中不允许返回.positive`

时间:2016-10-19 06:42:13

标签: ios swift enums switch-statement

我正在使用swift并且在使用switch语句时遇到错误且大于>比较一个数字。

Xcode显示以下消息:“Bool”类型的表达式模式不能匹配“Int”类型的值

我知道将case self > 0: return .positive替换为case let x where x > 0: return .positive,一切正常。

但我真的不明白为什么不允许case self > 0: return .positive?它背后的原因是什么?

extension Int {
    enum Kind {
        case negative, zero, positive
    }
    var kind: Kind {
        switch self {
        case 0:
            return .zero
//Error: expression pattern of type "Bool" cannot match values of type "Int"
//        case self > 0:
//            return .positive
        case let x where x > 0: //this works
            return .positive
        default:
            return .negative
        }
    }

}

3 个答案:

答案 0 :(得分:3)

这是一个关于switch语句的简单规则。

在每个switch语句的情况下,评估case之后的表达式,并将其与您正在接通的事物进行比较。

因此,在您的代码中,self > 0会被评估并与self进行比较。假设self为10,

self > 0 == self
true == 10 // WTF?

第二个case let x where x > 0不同,let x不是表达式。它基本上说:

  

在此case中,我希望为名为x的变量指定值self。但是,请在执行作业后x > 0执行此操作。如果!(x > 0),请转到另一个case

答案 1 :(得分:1)

错误消息告诉你一切。 “Bool”类型的表达式模式不能匹配“Int”类型的值。

case self > 0: // it will return Bool value but It needs to be a pattern against which the value can be matched

答案 2 :(得分:1)

由于switch语句执行模式匹配,因此在某些情况下,您无需绑定self的值并测试不等式/相等性,但可以修改positive的{​​{1}}情况以进行{{1的直接模式匹配到范围self。 E.g。

1...Int.max