Swift 递增隐式展开的可选
我声明隐式展开的可选项为:Swift 递增隐式展开的可选,swift,optional,Swift,Optional,我声明隐式展开的可选项为: var numberOfRows: Int! 并在init中初始化它: numberOfRows = 25 后来我需要把它减一,所以我写: numberOfRows-- 但这并没有编译。错误消息表示减量运算符不能应用于隐式展开的可选项。通过一些实验,我发现以下编译过程没有错误: numberOfRows!-- 我想了解这一点。什么是额外的“!”的解释 如果我们看一下可选类型是什么,我们会发现这是enum类似: enum Optional<T> {
var numberOfRows: Int!
并在init中初始化它:
numberOfRows = 25
后来我需要把它减一,所以我写:
numberOfRows--
但这并没有编译。错误消息表示减量运算符不能应用于隐式展开的可选项。通过一些实验,我发现以下编译过程没有错误:
numberOfRows!--
我想了解这一点。什么是额外的“!”的解释 如果我们看一下
可选类型是什么,我们会发现这是enum
类似:
enum Optional<T> {
case Some(T)
case None
}
您直接由指示
这不是Int
类型,而是enum可选类型。在创建时,如果与此值相等,则它将是一些
您已经知道它是enum可选的
,在接下来的某个时刻它将是None
。这就是为什么你必须使用代码>第二次执行此操作时:
var numberOfRows: Int!
numberOfRows!--
您的nomberows
值是可选的
类型,它可能是Int
或nil
,您必须直接指出这是Int
类型,才能执行-
操作。隐式取消包装的可选类型本身就是一个类型,它与包装的类型不同。optionals和隐式展开optionals上的某些运算符是语言为您预先定义的,但对于其他运算符,您必须自己定义它们
在这种特殊情况下,运算符postfix func--(inout值:Int!)->Int代码>只是没有定义。如果要在Int上使用后缀--
运算符代码>与在Int
上使用它的方式相同,然后必须定义一个
例如,类似于:
postfix func --<T: SignedIntegerType>(inout value: T!) -> T! {
guard let _value = value else { return nil }
value = _value - 1
return _value
}
postfix函数--(inout值:T!)->T!{
guard let _value=value else{return nil}
值=_值-1
返回值
}
为什么不跳过可选项并将int初始化为某个值,例如var numberOfRows:int=0
?显式展开的可选项仍然是可选项。这就是语言的工作方式。如果它真的困扰你,那么写numberOfRows=numberOfRows-1
。