我声明一个隐式解包的可选项:
var numberOfRows: Int!
并在init中初始化它:
numberOfRows = 25
后来我需要减1,所以我写道:
numberOfRows--
但这并没有编译。错误消息表示递减运算符不能应用于隐式展开的可选项。通过一些实验,我发现以下编译没有错误:
numberOfRows!--
我想理解这一点。什么是额外的'!'?
的解释是什么答案 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
可以是Int
或None
,在这种情况下,它有nil
值。
当你这样做时:
var numberOfRows: Int!
您!
直接表明这不是Int
类型,但这是enum Optional<Int>
类型。在创建的那一刻,如果它与Some<Int>
相等,那么它将!
,但是enum Optional<Int>
你知道它是None
,并且在下一刻它将是{{1} }}。这就是为什么你必须在第二次使用!
时才这样做:
numberOfRows!--
您的nomberOfRows
值为Optional<Int>
类型,可能是Int
或nil
,您必须直接指明这是Int
类型{ {1}}行动。