【发布时间】:2016-11-01 03:13:21
【问题描述】:
在 Swift 中,您可以使用 if let 可选绑定将可选项解包为具有相同名称的常量或变量:
func test()
{
let a: Int? = 1
if let a = a {
print("a = \(a)")
}
}
对于 if let 语句中的所有内容,可选的 a 被解包为常规 int。
同样,我可以使用一个guard语句来达到类似的效果
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)")
}
为什么不呢?
在保护语句中,如果保护语句的条件失败,则执行 else 子句并退出当前作用域。如果条件成功,则从保护语句的右大括号到当前范围的末尾创建一个新的变量/常量。
为什么我不能在当前范围的其余部分使用相同的技巧将可选映射到具有相同名称的变量/常量?
P.S.:我知道这个问题并不适合这个网站。我愿意接受有关在哪里解决这个问题的建议。
【问题讨论】:
-
在我看来
if方式在不同的范围内创建了两个变量,这很好,而guard方式将在同一范围内创建两个同名的变量,这将是一个奇怪的特殊情况并使变量解析规则复杂化以允许它。不过,我猜;我不认识斯威夫特。
标签: swift