**第一种方法
func show(value: Int?, or error: String) {
if let isValue = value {
print("Found: \(isValue)")
} else {
print(error)
}
}
show(value: 5, or: "No value found")
//print "Found: 5"
我想从上面的代码知道,即使我发现值非零并且我在函数体中也有条件代码,仍然会在场景后面评估传递错误字符串no value found
吗?每次我们尝试打开一个可选的?
**第二种方法
func show(value: Int?, or error: @autoclosure () -> String) {
if let isValue = value {
print("Found: \(isValue)")
} else {
print(error())
}
}
show(value: 5, or: "No value found")
//print "Found: 5"
或者此方法可行,仅在需要时评估错误表达式。或者两者在内存中都是相同的。我想要两种方法的答案。
答案 0 :(得分:2)
您的解释是正确的:第一个代码急切地准备error
字符串,而第二个代码推迟字符串构造直到需要它。
在您的情况下@autoclosure
并没有给您带来太多好处,因为从字符串文字构造string
与构造闭包一样便宜。
以下是区别变得重要的情况:
show(value: optValue, or: "No value of \(description) found for user \(user)")
现在必须通过插入字符串来构造error
字符串,操作不再便宜,因此使用@autoclosure
推迟它非常有意义。假设错误条件相对不频繁发生,构造一个抛弃闭包将比插入字符串更便宜。