Swift:无法在循环内解开可选内容

问题描述 投票:1回答:1

我不明白为什么在这种情况下可以展开可选值:

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。

swift optional unwrap
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.