我不明白为什么在这种情况下可以展开可选值:
let name: String? = "Toto"
guard let name = name else { fatalError() }
print(name)
但当此代码段包含在 for 循环中时则不然:
for _ in 0..<100 {
let name: String? = "Toto"
guard let name = name else { fatalError() }
print(name)
}
我收到错误“定义与以前的值冲突”。
在 Xcode 11.0 中使用 Swift 5。
最佳答案
如 Why isn't guard let foo = foo valid? 中所述,
let name: String? = "Toto"
guard let name = name else { fatalError() }
无效,因为 guard
没有引入新的作用域,并且在同一作用域中不能有两个同名的变量。
这在文件级别编译(即在“main.swift”中)是一个错误。显然,通过 guard
绑定(bind)的变量隐藏了另一个同名变量,无论它们的类型和声明顺序如何:
let aName = "Toto"
guard let aName = Int("123") else { fatalError() }
print(aName) // 123
guard let bName = Int("123") else { fatalError() }
let bName = "Toto"
print(bName) // 123
此错误已报告为 SR-1804 No compiler error for redeclaration of variable bound by guard .
关于Swift:无法在循环内解包可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58226900/