【问题标题】:Incrementing an implicitly unwrapped optional增加一个隐式展开的可选
【发布时间】:2015-11-03 16:59:54
【问题描述】:

我将一个隐式展开的可选声明为:

var numberOfRows: Int!

并在init中初始化:

numberOfRows = 25

稍后我需要将其减一,所以我写:

numberOfRows--

但这不会编译。错误消息说减量运算符不能应用于隐式展开的可选。通过一些实验,我发现以下编译没有错误:

numberOfRows!--

我想了解这一点。看起来像额外的“!”的解释是什么?

【问题讨论】:

  • 为什么不跳过可选的并将您的 int 初始化为某些东西,例如var numberOfRows:Int = 0?显式展开的可选项仍然是可选项。
  • 这就是语言的工作原理。如果真的让您感到困扰,请写信numberOfRows = numberOfRows - 1

标签: swift optional


【解决方案1】:

隐式解包的可选 是一个独立的类型,与它所包装的类型不同。 optionalsimplicitly unwrapped optionals 上的一些运算符是由语言预先为您预先定义的,但对于其余的,您必须自己定义它们。

在这种特殊情况下,运算符postfix func --(inout value: Int!) -> Int! 只是没有定义。如果您想在 Int! 上使用后缀 -- 运算符,就像在 Int 上使用它一样,那么您必须定义一个。

例如类似:

postfix func --<T: SignedIntegerType>(inout value: T!) -> T! {
    guard let _value = value else { return nil }

    value = _value - 1
    return _value
}

【讨论】:

    【解决方案2】:

    如果我们查看optional 类型是什么,我们会看到这是enum,例如:

    enum Optional<T> {
        case Some(T)
        case None
    }
    

    它可以是Some Type,例如IntNone,在这种情况下它具有nil 值。

    当你这样做时:

    var numberOfRows: Int!
    

    ! 直接指示您这不是Int 类型,而是enum Optional&lt;Int&gt; 类型。在创建的那一刻,它将是Some&lt;Int&gt;,如果它的值相等,但是有了这个!,你就知道它是enum Optional&lt;Int&gt;,在下一个时刻它将是None。这就是为什么你必须第二次使用!

    numberOfRows!--
    

    您的nomberOfRows 值是Optional&lt;Int&gt; 类型,它可能是Intnil,您必须直接指出这是Int 类型才能进行-- 操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多