可选链让我们根据对象的存在做出决定:
var text : String?
let len = text?.lengthOfBytes(using: .utf8) ?? 0
它总是将 len
设置为一个整数。
对于非可选函数参数是否可能有类似的东西?考虑以下示例,该示例使用三元运算符已经不够优雅。
func length(text: String) -> Int {
return text.lengthOfBytes(using: .utf8)
}
var text : String?
let len = (text != nil) ? length(text!) : 0
如果我们继续链接,它很容易变得一团糟(这就是我实际看到的):
let y = (arg!= nil) ? (foo?.bar(arg!) ?? 0) : 0 // how to improve on this?
此外,它也开始变得冗余,定义了两次默认值。
最后一行有没有更简洁的解决方案?
最佳答案
map
方法是最好的方法。 flatMap
也可能很有趣。
func length(text: String) -> Int {
return text.lengthOfBytes(using: .utf8)
}
var text : String?
let len = text.map(length) ?? 0
如果你有多个参数,你可以很容易地写一个函数 (A?, B?) -> (A, B)?
。
关于swift - 可选的链接和合并,包括。函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48076179/