有时我发现自己在写swift 2代码时是这样的:
class Test {
var optionalInt: Int?
var nonOptionalInt: Int = 0
func test() {
if let i = optionalInt {
nonOptionalInt = i
}
// do more stuff
}
}
问题在于:
if let i = optionalInt {
nonOptionalInt = i
}
换句话说:如果optionalInt有一个值,就将它赋给变量nonOptionalInt,否则什么都不做。
在swift 2中有没有一种等价的方法,可以用一行简洁的语句来表达,而不用添加一个中间变量if let i?
编辑
在思考了第一个答案之后...
显然有一种等效的方法
if optionalInt != nil {
nonOptionalInt = optionalInt!
}
三元运算符?:不等效,因为它们可能触发原始代码不触发的didSet(如果这是预期的副作用,则为好)
到目前为止,最优雅的答案似乎是
nonOptionalInt = optionalInt ?? nonOptionalInt
它也可能触发类似三元运算符的didSet,因此并不等效(如果是有意的,也是好的)。
我想我对苹果的愿望应该是
nonOptionalInt = optionalInt ??
或
nonOptionalInt ??= optionalInt
3条答案
按热度按时间1cklez4t1#
您正在寻找的是nil合并运算符。
在这种情况下,您可以这样使用它:
编辑
回复:您对您问题的最后一次编辑:
“* 我想我对苹果的愿望应该是 *
nonOptionalInt ??= optionalInt
“......当你能建造它的时候,为什么要许愿呢?:)
我还没有充分考虑过是否建议在一般情况下使用这样的操作符,但是如果它对您的情况有帮助,您可以创建一个
??=
操作符,它可以像下面这样执行您所要求的操作:然后,看看它实际运作:
toe950272#
Swift 4.0版本构建自2.0er答案
wnrlj8wa3#
在swift 2中有没有一种等价的方法,可以用一行简洁的语句来表达,而不用添加一个中间变量if let i?
如果要执行以下操作,可以省略中间值:
当然,如果需要,您可以将所有内容放在一行中:
但是,如果您愿意,也可以使用三元运算符:
这里的
0
只是optionalInt == nil
情况下使用的默认值。如果你不想把nonOptionalInt
改为optionalInt == nil
,那么就使用nonOptionalInt
:请注意,
optionalInt!
中的!
隐式地展开了可选值--这是您告诉编译器您知道optionalInt
不是nil
的方式,因此可以将其赋值给非可选变量。