Swift:无法在循环内解包可选

标签 swift option-type unwrap

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

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/

相关文章:

swift - 使用 Swift Package Manager、Cocoa Pods 或其他工具将最小 GRDB 添加到 Xcode 项目

ios - 更改导航栏标题字体 - swift

uitableview - Swift 赋值左侧使用的可选链接

swift - 使字典值作为扩展名成为非可选

pattern-matching - 这个解包/模式匹配代码可以更清晰/惯用吗?

ios - 在另一个圆形 UIView 中移动一个圆形 UIView

iOS NSDate() 返回错误的时间

带有可选值的 Java 8 泛型集合

ios - 从 CoreData 中解包 Date() 类型的选项?

rust - 进行unwrap_or_return的任何方式以尽早返回