【问题标题】:Why do implicitly unwrapped optionals need to unwrapped again in conditionals?为什么隐式解包的选项需要在条件句中再次解包?
【发布时间】:2016-03-14 21:51:49
【问题描述】:

例如,我有这样的类,而不是创建我将在 init 方法中分配的字段,我只想隐式地解包选项。

class foo {
  willBeSomeBool: Bool!
  willBeSomeString: String!
}

我理解这样做的原因是,当我声明它们时,它们的初始值为nil,因此我不需要init,因为所有类的字段都有初始值。我需要做的就是确保在尝试访问它们之前为它们分配了一些东西,否则我会得到一个致命的错误。

假设我们已经为字段分配了值,现在我们在某种方法中,我要问的是:为什么我们需要在条件中使用 bool 时强制解包它? 我可以访问其他隐式展开的选项,甚至是布尔值,而无需在条件之外这样做。

func bar() {
  if willBeSomeBool! {
    ...
  }
}

func buzz() {
  print(willBeSomeString)
}

对此我最好的猜测是因为我们仍然可以在隐式展开变量上检查 nil,因此在条件上下文中它被视为只是一个普通的可选变量,但就像我说的那样,这是我最好的 猜猜,也许我还漏掉了什么?

【问题讨论】:

    标签: swift


    【解决方案1】:

    为什么在条件语句中使用 bool 时需要强制解包

    这是一个历史问题。曾几何时,在 Swift 的早期,一个 Optional 可以用作条件来询问它是否是nil。因此,您可能认为if willBeSomeBoolnil 测试存在残余的担忧。因此,您必须明确测试 nil 或解包,以便我们拥有真正的 Bool,从而证明您知道自己在做什么——并防止您误解自己的结果。

    这样看。你不能说if willBeSomeString。您只能说更明确的内容,if willBeSomeString == nilif willBeSomeString == "howdy"。所以让willBeSomeBool 遵循同样的模式是最简单的。

    【讨论】:

    • 这有点符合 Swift 的规则,即尽量不要用秘密的含义让程序员感到惊讶。他们并不总是像他们可能的那样遵守这条规则,但你可以看到他们正在努力;这就是为什么 var 参数和递增/递减运算符和 C 风格的 for 循环将消失的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 2014-07-23
    • 2014-11-24
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    相关资源
    最近更新 更多