【问题标题】:Why does this Swift != nil check fail? [duplicate]为什么这个 Swift != nil 检查失败? [复制]
【发布时间】:2020-09-29 18:15:20
【问题描述】:

当变量窗口(和打印语句)显示test nil 时,我不明白为什么执行落入 debugPrint 语句中:

                let test = cxticsByUuid[cxtic.uuid]
                if test != nil
                {
                    debugPrint("Duplicate cxtic retrieved. Bailing out of peripheral's didDiscoverCharacteristicsFor...")
                    return
                }

更新:虽然变量窗口显示有问题的变量为零,但它实际上是一个 double 可选的。所以它必须拆开两次,如相关帖子中所示。

【问题讨论】:

  • 简而言之:使用if let test = cxticsByUuid[cxtic.uuid] ?? nil { ... }
  • @pawello2222 我认为您已经解决了问题,但这不是重复的 IMO(许多读者不清楚为什么这是原因)。如果您愿意写一个解释这里发生的事情的答案,那可能会非常有帮助。 (特别解释为什么nil != .some(nil)。)
  • @RobNapier 我已经阅读了 vacawama 对重复问题的回答,它看起来非常清晰和详细。我认为它没有遗漏任何东西。
  • 如果 Oscar 理解(而且他们似乎理解),那么这表明它肯定足够接近。谢谢。
  • 是的,直到发布这个之后我才注意到双重可选,但我离开了它,因为这种行为可能令人困惑;一切都表明有问题的变量为零。

标签: swift null optional


【解决方案1】:

在这种情况下你应该使用 if let。

if let test = cxticsByUuid[cxtic.uuid] {
    debugPrint("Duplicate cxtic retrieved. Bailing out of peripheral's didDiscoverCharacteristicsFor...")
} else {
    //variable test is nil
}

【讨论】:

  • 谢谢,但以完全相同的方式失败。我没有改装你。
  • 不是这样的,当你想访问里面的非可选变量时,你可以这样做,如果让,那里提供的情况也是有效的,以检查它是否不为零。跨度>
  • 这不是简单地添加一个关于test 未被使用的无用编译器警告吗?
  • @Gereon 如果您不需要在 nil 情况下执行任何操作,您可以随时省略 else {...} 部分。
  • 您可以使用if let _ = cxticsByUuid[cxtic.uuid] 避免编译器警告。但是这个答案中的解决方案并不能解决双重可选问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 2018-03-02
  • 1970-01-01
  • 2018-05-18
  • 2014-01-16
  • 2011-09-01
相关资源
最近更新 更多