递增一个隐式解包的可选

Incrementing an implicitly unwrapped optional

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

var numberOfRows: Int!

并在 init:

中初始化
numberOfRows = 25

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

numberOfRows--

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

numberOfRows!--

我想了解一下。看起来像额外的'!'的解释是什么?

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

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

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

当你做这个的时候:

var numberOfRows: Int!

你直接被!表明这不是Int类型而是enum Optional<Int>类型。在创建时,如果等于它的值,它将是 Some<Int>,但是对于这个 !,你得到它是 enum Optional<Int>,在接下来的某个时刻它将是 None。这就是为什么你必须第二次使用 ! 的原因:

numberOfRows!--

你的nomberOfRows值是Optional<Int>类型可能是Int或者nil你要直接说明这是Int类型进行 -- 操作。

隐式解包可选 本身就是一种类型,不同于它包装的类型。 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
}