我希望能夠以與常用的 if-else 簡寫類似的方式使用 if-let <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 也必須是 a var,而一個行速記可以分配給一個let常量。
是否有任何現有的語法可以完成這個 if-let 速記?如果沒有任何理由 Swift 還沒有實作這種語法?
謝謝!
uj5u.com熱心網友回復:
你可以這樣寫map:
let dict = getName().map { name in ["name": name] } ?? ["error": "no name"]
閉包引數是<let condition creating variable v1>,閉包的回傳值是<expression using v1>。x.map為nil 時回傳 nil x,因此后面的內容??對應于<expression not using v1>.
代替{ name in ["name": name] },您也可以將其縮短為{ ["name": $0] }。
請注意,dict“多行版本”中的 可以宣告為let:
let dict: [String: String]
if let name = getName() {
dict = ["name": name]
} else {
dict = ["error": "no name"]
}
編譯器足夠聰明,可以看到 if 陳述句的每個分支都是互斥的,并且必須執行其中一個分支,因此您不會重新分配let.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/471905.html
