Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 递增隐式展开的可选_Swift_Optional - Fatal编程技术网

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