快速评估策略

时间:2018-02-17 09:09:39

标签: swift

**第一种方法

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"

或者此方法可行,仅在需要时评估错误表达式。或者两者在内存中都是相同的。我想要两种方法的答案。

1 个答案:

答案 0 :(得分:2)

您的解释是正确的:第一个代码急切地准备error字符串,而第二个代码推迟字符串构造直到需要它。

在您的情况下@autoclosure并没有给您带来太多好处,因为从字符串文字构造string与构造闭包一样便宜。

以下是区别变得重要的情况:

show(value: optValue, or: "No value of \(description) found for user \(user)")

现在必须通过插入字符串来构造error字符串,操作不再便宜,因此使用@autoclosure推迟它非常有意义。假设错误条件相对不频繁发生,构造一个抛弃闭包将比插入字符串更便宜。