在Swift中赋值条件表达式

laawzig2  于 12个月前  发布在  Swift
关注(0)|答案(3)|浏览(126)

1.在Swift中有没有一种方法来分配类似于这样的条件表达式:

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

字符串
1.可以使用switch/case吗?

注1:我不希望必须使用三元运算符)。

这种类型的赋值对函数式风格/不变性很好。在这种情况下,表达式有一个返回值。

**注2:**这是一个一般性的问题,这只是一个简化的例子,想象一下一个有很多值的开关情况,模式匹配等。你不能用三元运算符来做这些。

顺便说一句,也要注意,有些语言(如Scala)不支持三元运算符,因为if else返回一个值,所以它是不必要的。

snz8szmq

snz8szmq1#

你可以使用闭包来初始化一个不可变的:

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起,延迟初始化也支持immutables

i1icjdpr

i1icjdpr2#

Swift 5.9增加了对if表达式的支持:SE-0380
这将允许:

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

字符串

vbopmzt1

vbopmzt13#

Swift 5.9

如果你只有一个条件需要检查,你可以使用一个简单if/else表达式的结果,就像你已经从Swift 5.9发布的那样。
一行程序的版本如下所示:

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

字符串
对于更复杂的情况,您可以直接switch/case表达式中赋值,如:

let foo = switch bar {
    case 1: "Simple expression"
    case 2: "More" + " " + "complicated" + " " + "Expression"
    case 3: 
        let expression = { /* Very complicated stuff */ }()
        let result = String(describing: expression())
        return result
    default: "All of these are samples"
}


为了回答的完整性,不要忘记你可以在Swift中对简单的表达式执行ternary operator

let foo = bar == 2 ? 100 : 120


️尽管你可以混合使用以上方法,甚至使用闭包,但请根据表达式的复杂性选择所需的方法**,并尽量保持代码易于阅读

相关问题