我声明如下:
var x:Int?
var y:Int?
我希望第三个变量z
包含x
和y
的总和。据推测,正如x
& y
是可选项,z
也必须是可选项:
var z:Int? = x + y
但这会给出编译器错误“可选类型'Int?'的值没打开;你的意思是用'!'或'?'“
如果我打开x
& y
:
var z:Int? = x! + y!
我的运行时错误为x
& y
为零,因此无法解开。
我可以达到如下所需的结果:
var z:Int?
if let x1 = x {
if let y1 = y {
z = x1+y1
}
}
但是将2个整数加在一起似乎有点冗长!有没有更好的方法来实现这一目标?
答案 0 :(得分:4)
这是我的看法,我认为它更清洁:
let none:Int? = nil
let some:Int? = 2
func + (left: Int?, right:Int?) -> Int? {
return left != nil ? right != nil ? left! + right! : left : right
}
println(none + none)
println(none + some)
println(some + none)
println(some + some)
println(2 + 2)
结果:
nil
Optional(2)
Optional(2)
Optional(4)
4
答案 1 :(得分:3)
我能想到的最好的是:
if x && y {
z = x! + y!;
}
因为它们都是Optionals ......真的没有办法避免:
nil
答案 2 :(得分:2)
这完全取决于你想要实现的目标,但你可以使用可选的元组来实现:
var xy: (Int, Int)?
var z: Int
if let (x1, y1) = xy {
z = x1 + y1 // Not executed
}
xy = (3, 4)
if let (x1, y1) = xy {
z = x1 + y1 // 7
}
更新的 正如@Jack Wu指出的那样,这改变了语义。如果你愿意更加冗长,你可以这样做:
func optIntAdd(x: Int?, y: Int?) -> Int? {
if let x1 = x {
if let y1 = y {
return x1 + y1
}
}
return nil
}
operator infix +! { }
@infix func +! (x: Int?, y: Int?) -> Int?{
return optIntAdd(x, y)
}
var x: Int?
var y: Int?
var z: Int?
z = x +! y // nil
x = 1
z = x +! y // nil
y = 2
z = x +! y // 3
不确定“+!”是操作员名称的有用选择,但它不能让我选择“+?”。
答案 3 :(得分:2)
最佳解决方案IMO:
z = x.map { x in y.map { $0 + x } }
您是否知道Optional<T>
上的地图运算符?这是很不错的。
文档说:
如果self == nil,则返回nil。否则,返回f(self!)。
答案 4 :(得分:0)
z =(x ?? 0)+(y ?? 0)
*使用Xcode 9 *
答案 5 :(得分:-1)
使用可选链接:
z = x? + y?