增加一个隐式解包的可选项

时间:2015-11-03 16:59:54

标签: swift optional

我声明一个隐式解包的可选项:

var numberOfRows: Int!

并在init中初始化它:

numberOfRows = 25

后来我需要减1,所以我写道:

numberOfRows--

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

numberOfRows!--

我想理解这一点。什么是额外的'!'?

的解释是什么

2 个答案:

答案 0 :(得分:3)

隐式解包的可选本身就是一种类型,与包装它的类型不同。 选项隐式解包的选项上的某些运算符是由语言为您预先定义的,但对于其他运算符,您必须自己定义它们。

在这种特殊情况下,运算符postfix func --(inout value: Int!) -> Int!尚未定义。如果您想在--上使用postfix Int!运算符,就像在Int上使用它一样,那么您必须定义一个。{/ p>

E.g。类似的东西:

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

    value = _value - 1
    return _value
}

答案 1 :(得分:0)

如果我们查看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,并且在下一刻它将是{{1} }}。这就是为什么你必须在第二次使用!时才这样做:

numberOfRows!--

您的nomberOfRows值为Optional<Int>类型,可能是Intnil,您必须直接指明这是Int类型{ {1}}行动。