好吧...这是代码
func howMany() -> Int {
return 10
}
func Call() -> Void {
guard case let output = howMany(), output > 5 else { return }
}
Call()
我并不真正了解警卫案的运作方式。这看起来很像是一个模式匹配条件,我们比较 howMany()的结果是否等于 output ,如果是,则将值分配给 output ,然后将其与文字值 5 进行比较。但是,当我删除 output> 5 这一行时,编译器会说:“保护条件始终为真,正文不可访问。”
根据模式,如果我们将其转换为switch语句,则看起来很像这样
switch howMany() {
case let output where output > 5:
break;
}
问题是,如果可以将其直接转换为switch语句,那么在删除where条件时,不应出现“保护条件始终为真,正文不可访问”的警告
我希望有人能对此有所启发。
答案 0 :(得分:3)
考虑:
func foo() {
guard case let output = howMany(), output > 5 else {
print("less than or equal to 5")
return
}
print("\(output) is greater than 5")
}
大致相当于:
func bar() {
switch howMany() {
case let output where output > 5:
print("\(output) is greater than 5")
default:
print("less than or equal to 5")
return
}
}
如果您删除了> 5
个条件:
func foo() {
guard case let output = howMany() else {
print("less than or equal to 5")
return
}
print("\(output) is greater than 5")
}
您得到警告:
'守卫'条件始终为真,身体无法触及
该警告是正确的,因为身体 无法到达。
如果您在switch
示例中进行了等效操作:
func bar() {
switch howMany() {
case let output:
print("\(output) is greater than 5")
default:
print("less than or equal to 5")
return
}
}
如果您这样做,将会收到类似的警告:
默认将永远不会执行
同样,这是有道理的,因为将不会到达default
。
现在,考虑没有switch
子句的示例default
:
func bar() {
switch howMany() {
case let output:
print("output:", output)
}
}
您不会在这里收到警告仅仅是因为没有default
子句(guard
语句的“ body”的类似物)。