Ios 为什么`案例自我>;0:返回。switch语句中不允许为正“”
我正在使用swift,在使用switch语句和大于>比较数字时遇到错误 Xcode显示以下消息:“Bool”类型的表达式模式不能与“Int”类型的值匹配 我知道,通过将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
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的评论中提到过这一点!