我不明白为什么在这种情况下可以展开可选值:
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
绑定的变量隐藏了同名的另一个变量,而与声明它们的类型和顺序无关:
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。