有没有if-let one liner shorthand?

Is there an if-let one liner shorthand?

我希望能够以与常用的 if-else 类似的方式使用 if-let shorthand:<condition> ? <expression1> : <expression2>。此语法看起来像这样:

<let condition creating variable v1> ? <expression using v1> : <expression not using v1>

以下是此语法的示例(无法编译):

let name: String? = getName()

var dict: [String: String]? = let name = name ? ["name": name] : nil

我知道可能的多行等价物如下:

let name: String? = getName()

var dict: [String: String]?
if let name = name {
  dict = ["name": name]
} else {
  dict = ["error": "no name"]
}

但即使是这个多行示例,dict 也必须是 var,而一行 shorthand 可以分配给 let 常量。

是否有任何现有语法可以完成此 if-let shorthand?如果没有,那么 Swift 是否已经没有实现此语法?

谢谢!

你可以这样写 map:

let dict = getName().map { name in ["name": name] } ?? ["error": "no name"]

闭包参数是<let condition creating variable v1>,闭包的return值是<expression using v1>x.map returns nil 当x为nil时,所以??之后的东西对应于<expression not using v1>.

代替{ name in ["name": name] },您也可以将其缩短为{ ["name": [=20=]] }


请注意,“多行版本”中的 dict 可以声明为 let:

let dict: [String: String]
if let name = getName() {
  dict = ["name": name]
} else {
  dict = ["error": "no name"]
}

编译器很聪明,可以看出 if 语句的每个分支都是互斥的,必须执行其中一个分支,所以你没有重新分配一个 let