我不明白为什么在这种情况下可以展开可选值:
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。
答案 0 :(得分:3)
如Why isn't guard let foo = foo valid?中所述,
let name: String? = "Toto"
guard let name = name else { fatalError() }
无效,因为guard
没有引入新的作用域,并且在同一作用域中不能有两个具有相同名称的变量。
这在文件级别(即在“ main.swift”中)进行编译是一个错误。显然,通过guard
绑定的变量隐藏了同名的另一个变量,而与声明它们的类型和顺序无关:
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。