【问题标题】:Swift: Can't unwrap an optional inside a loop斯威夫特:不能在循环中解开一个可选的
【发布时间】:2019-10-03 21:07:15
【问题描述】:

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

let name: String? = "Toto"
guard let name = name else { fatalError() }
print(name)

但当这个 sn-p 被包裹在 for 循环中时:

for _ in 0..<100 {
  let name: String? = "Toto"
  guard let name = name else { fatalError() }
  print(name)
}

我收到错误“定义与以前的值冲突”。

在 Xcode 11.0 中使用 Swift 5。

【问题讨论】:

  • 谢谢,仍然不明白为什么它在第一种情况下不起作用,因为 name 也在同一范围内重新定义。
  • 你在哪里做这个?一个快速的游乐场?
  • 我在 Playground 和真实项目(Mac 应用程序)中都对其进行了测试。
  • 好吧,你难倒我了。这是奇怪的行为。 MartinR 提供的链接很好地理解和解释了为什么您不能在循环中执行此操作。至于第一种情况,???循环中的解决方法当然很简单,使用一个新的变量名。

标签: swift optional unwrap


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2017-07-22
    • 2017-03-24
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多