Swift:添加选项Ints

时间:2014-06-27 13:04:46

标签: swift optional

我声明如下:

var x:Int?
var y:Int?

我希望第三个变量z包含xy的总和。据推测,正如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个整数加在一起似乎有点冗长!有没有更好的方法来实现这一目标?

6 个答案:

答案 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 ......真的没有办法避免:

  1. 检查它们不是nil
  2. 在添加之前解开它们。

答案 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?