【问题标题】:Swift optionals - Why does var a:Int? a? = 4 return nilSwift 选项 - 为什么 var a:Int?一种? = 4 返回零
【发布时间】:2018-07-29 16:46:50
【问题描述】:

为什么print(a) 在下面的代码中打印为零?

var a:Int?
a? = 4
print(a)  //prints nil

var b:Int? = 4
print(b) //prints optional(4) 

它们不应该都包含 4 吗?谁能解释一下?

【问题讨论】:

  • 问题是表达式a? = 4(你的意思是a = 4)。我不明白为什么它首先编译;也许这应该是一个错误。

标签: swift optional


【解决方案1】:

var a: Int? 行声明了一个带有 nil 值的可选变量。

a? = 4 行使用可选链为变量a 赋值。但是如果anil,则分配没有完成。这是你的情况,因为a 目前是nil。您只需要a = 44 的值赋给变量a

【讨论】:

  • 好的,这是bugs.swift.org/browse/SR-6498 - 语法是合法的(无论我喜欢与否,它可选链接)但建议是这应该警告,因为这并不意味着人们认为它做了什么
  • 有趣。 a? = 4 的效果是“如果 a 为 nil,则将其替换为 4。如果它已经有值,则不管它。”这是违反直觉的,但可能很有用。我会将它与 C 中的 if (a = b) 放在同一类别中,这是合法的,可以建设性地使用,但很容易出错,因此在没有编译器警告的情况下不应允许这样做。
  • @DuncanC 您的第一句话不正确。您的意思是:a? = 4 的效果是“如果 a not nil,则将其替换为 4.
  • 哦,是的。我倒过来了。那用处不大。感谢您指出我的错误。
【解决方案2】:

而不是......一样?为 nil 整个语句将不会运行

a? = 4       ==   nil = 4

a = 4

【讨论】:

  • @Daniel 在 Stack Overflow 上有一个技术类别“不是答案”,我向您保证,这不在该类别中。我们在 Meta 上已经讨论过很多次了。不回答会是“是的,我也遇到了这个问题”或“请点击此链接”或“您解决过这个问题吗?”
猜你喜欢
  • 2018-02-26
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多