【发布时间】:2018-06-13 01:22:01
【问题描述】:
可选链让我们决定对象的存在:
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?
此外,它也开始变得多余,定义了两次默认值。
最后一行还有更简洁的解决方案吗?
【问题讨论】:
-
我认为可选链接就足够了,关于你的情况我会说:
let len = length(text: text ?? "") -
或
let len = text.map(length) ?? 0 -
使用默认参数有缺点:1) 函数调用成本可能很高,2) 它将默认值的逻辑放入该函数并远离其上下文。
-
@Eiko 只需使用 nil 合并运算符。顺便说一句,无需创建方法来获取字符串的字节数。只需获取 utf8 CharacterView
yourString.utf8.count的计数,如果您的字符串是可选的let len = text?.utf8.count ?? 0 -
字节数只是一个例子,根本没有理由改进第一个例子。问题是关于如何绕过函数调用,而 nil 合并似乎并没有提供解决方案。
标签: swift swift4 null-coalescing optional-chaining