在Swift中分配条件表达式?

时间:2014-12-05 12:15:50

标签: swift

Swift中有没有办法分配类似于此

的条件表达式
let foo = if (bar == 2) {
        100
    } else {
        120
    }

(或用开关盒)。

(不想为此使用三元运算符。)

这种分配有利于功能风格/不变性。在这种情况下,表达式具有返回值。

注意:这是一个普遍的问题,这只是简化的例子,想象一下一个具有大量值,模式匹配等的开关盒。你不能用三元运算符做到这一点。

顺便说一下,有些语言不支持三元运算符,因为if else返回一个值,所以没有必要,参见例如Scala

1 个答案:

答案 0 :(得分:13)

您可以使用闭包来初始化不可变的:

let foo: Int = {
    if bar == 2 {
        return 100
    } else {
        return 120
    }
}()

使用闭包的优点在于它是一个函数,因此您可以使用任何复杂的逻辑,以干净的方式实现,而不是通过嵌套的三元运算符。它可以是switch语句,它可以作为函数的返回值获得,然后进行一些计算,它可以是模式匹配的情况,它可以是它们的组合,等等。

换句话说,它与使用函数的返回值进行初始化相同,但区别在于函数是内联函数而不是其他函数,具有可读性。

为了完整性,如果变量是可变,则可以使用延迟初始化:

var foo: Int

// Any statement here

if bar == 2 {
    foo = 100
} else {
    foo = 120
}

// Other statements here

myFunc(foo)

所以你可以声明一个可变变量,并在同一范围内的任何地方初始化它,但在使用之前必须初始化变量。

更新:自Swift 2.0起,延迟初始化也适用于不可变项