Ios 为什么`案例自我>;0:返回。switch语句中不允许为正“”

Ios 为什么`案例自我>;0:返回。switch语句中不允许为正“”,ios,swift,enums,switch-statement,Ios,Swift,Enums,Switch Statement,我正在使用swift,在使用switch语句和大于>比较数字时遇到错误 Xcode显示以下消息:“Bool”类型的表达式模式不能与“Int”类型的值匹配 我知道,通过将case self>0:return.positive替换为case let x,其中x>0:return.positive,一切正常 但我真的不明白为什么case self>0:return。不允许使用正数?背后的原因是什么 extension Int { enum Kind { case negativ

我正在使用swift,在使用switch语句和大于>比较数字时遇到错误

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

我知道,通过将
case self>0:return.positive
替换为
case let x,其中x>0:return.positive
,一切正常

但我真的不明白为什么
case self>0:return。不允许使用正数
?背后的原因是什么

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
        }
    }

}

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


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


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

在switch语句的每种情况下,都会计算紧跟在
case
之后的表达式,并将其与正在打开的内容进行比较

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

self > 0 == self
true == 10 // WTF?
第二个
案例let x,其中x>0
不同,
let x
不是一个表达式。它基本上是说:

在这种
情况下
,我希望为名为
x
的变量赋值
self
。但请仅在完成作业后
x>0
时执行此操作。如果
!(x>0)
,转到另一个
案例


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

在switch语句的每种情况下,都会计算紧跟在
case
之后的表达式,并将其与正在打开的内容进行比较

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

self > 0 == self
true == 10 // WTF?
第二个
案例let x,其中x>0
不同,
let x
不是一个表达式。它基本上是说:

在这种
情况下
,我希望为名为
x
的变量赋值
self
。但请仅在完成作业后
x>0
时执行此操作。如果
!(x>0)
,转到另一个
案例


由于switch语句执行模式匹配,因此在某些情况下,您不必绑定self的值并测试不平等性/相等性,但可以将
positive
案例修改为
self
的直接模式匹配范围
1…Int.max
。例如

extension Int {
    enum Kind {
        case negative, zero, positive
    }
    var kind: Kind {
        switch self {
        case 0:
            return .zero
        case 1...Int.max:
            return .positive
        default:
            return .negative
        }
    }
}

由于switch语句执行模式匹配,因此在某些情况下,您不必绑定self的值并测试不平等性/相等性,但可以将
positive
案例修改为
self
的直接模式匹配范围
1…Int.max
。例如

extension Int {
    enum Kind {
        case negative, zero, positive
    }
    var kind: Kind {
        switch self {
        case 0:
            return .zero
        case 1...Int.max:
            return .positive
        default:
            return .negative
        }
    }
}

错误消息告诉您一切。“Bool”类型的表达式模式无法与类似问题的“Int”类型的值相匹配。在Swift 3
案例1中,…Int.max:
也可以使用。@MartinR感谢所有有用的评论!我很荣幸能得到一位swift专家的帮助:)也可以使用
案例检查“积极”案例,其中self>0:
——正如您在对一个旧问题的评论中提到的。错误消息告诉您一切。“Bool”类型的表达式模式无法与类似问题的“Int”类型的值相匹配。在Swift 3
案例1中,…Int.max:
也可以使用。@MartinR感谢所有有用的评论!我很荣幸能得到一位swift专家的帮助:)也可以使用
案例检查“积极”案例,其中self>0:
–正如您在对一个旧问题的评论中所提到的。不,案例表达式不必像您在
案例let x where x>0:
中看到的那样是一个常量表达式。它必须是一种模式,价值可以与之匹配。我同意。它需要是一个模式,可以根据该模式匹配值。不,case表达式不需要是常量表达式,正如您在
case let x中看到的那样,其中x>0:
。它必须是一种模式,价值可以与之匹配。我同意。它需要是一个模式,根据它的值可以匹配。非常感谢!这很有道理!我很难理解这一点。再次感谢!非常感谢你!这很有道理!我很难理解这一点。再次感谢!为什么不
案例:1…Int.max:
?()@MartinR当然,谢谢(出于某种原因,我一直想表示开闭范围
(0,Int.max]
,满足于
[0,Int.max]
,保证
0
排除,而不考虑我们使用整数的事实)。没有注意到您在对Q的评论中已经提到过这一点!为什么不
案例:1…Int.max:
?()@MartinR当然,谢谢(出于某种原因,我一直想表示开闭范围
(0,Int.max]
,对
[0,Int.max]感到满意)
有保证的
0
排除,不考虑我们正在处理整数的事实)。错过了你已经在对Q的评论中提到过这一点!