递增一个隐式解包的可选
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
,例如 Int
或 None
,在这种情况下它具有 nil
值。
当你做这个的时候:
var numberOfRows: Int!
你直接被!
表明这不是Int
类型而是enum Optional<Int>
类型。在创建时,如果等于它的值,它将是 Some<Int>
,但是对于这个 !
,你得到它是 enum Optional<Int>
,在接下来的某个时刻它将是 None
。这就是为什么你必须第二次使用 !
的原因:
numberOfRows!--
你的nomberOfRows
值是Optional<Int>
类型可能是Int
或者nil
你要直接说明这是Int
类型进行 --
操作。
隐式解包可选 本身就是一种类型,不同于它包装的类型。 optionals 和 implicitly 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
}
我将一个隐式展开的可选声明为:
var numberOfRows: Int!
并在 init:
中初始化numberOfRows = 25
稍后我需要将它减一,所以我写:
numberOfRows--
但这不能编译。错误消息说递减运算符不能应用于隐式解包的可选。通过一些实验,我发现以下编译没有错误:
numberOfRows!--
我想了解一下。看起来像额外的'!'的解释是什么?
如果我们查看 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
。这就是为什么你必须第二次使用 !
的原因:
numberOfRows!--
你的nomberOfRows
值是Optional<Int>
类型可能是Int
或者nil
你要直接说明这是Int
类型进行 --
操作。
隐式解包可选 本身就是一种类型,不同于它包装的类型。 optionals 和 implicitly 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
}