在Swift中,您可以使用if let可选绑定将可选项解包为具有相同名称的常量或变量:
func test()
{
let a: Int? = 1
if let a = a {
print("a = \(a)")
}
}
对于if let
语句中的所有内容,可选值a
都会被拆包成普通的整数。
同样地,我可以使用守卫语句来达到类似的效果。
func test()
{
let a: Int? = 1
guard let requiredA = a else{
return
}
print("a = \(requiredA)")
}
然而,我不能使用这样的代码:guard let a = a else
:
func test()
{
let a: Int? = 1
guard let a = a else{
return
}
print("a = \(a)")
}
为什么不呢?
在 guard 语句中,如果 guard 语句的条件失败,则执行 else 子句并退出当前作用域。如果条件成功,则从 guard 语句的右括号到当前作用域的结尾创建一个新的变量/常量。
为什么我不能使用同名的变量/常量将可选项映射到当前作用域的剩余部分?
附言:我意识到这个问题不是这个网站的完美匹配。如果您有更好的建议,请告诉我应该去哪里问这个问题。
if
的方式会在不同的作用域中创建两个变量,这是可以接受的。而guard
的方式则会在同一作用域中创建两个同名变量,这将是一个奇怪的特殊情况,并且为了允许它而使变量解析规则变得复杂。虽然我猜测如此,但我不懂 Swift。 - user2357112