有没有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
。
我希望能够以与常用的 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
。