Swift 3尝试使用默认值

Swift 3尝试使用默认值,swift,Swift,我正在学习Swift并测试以下代码 var value: String; do { value = try getValue() } catch { value = "Default Value" } 可以缩短为 let value = (try? getValue()) ?? "Default Value" 它是有效的,但我觉得我可能缺少了一个更明显的解决方案。您的解决方案非常棒,而且非常优雅 我想我们应该避免在第一行中说var,然后再初始化变量。通常,使用复杂初始值设定项立即初始

我正在学习Swift并测试以下代码

var value: String;
do {
  value = try getValue()
} catch {
  value = "Default Value"
}
可以缩短为

let value = (try? getValue()) ?? "Default Value"

它是有效的,但我觉得我可能缺少了一个更明显的解决方案。

您的解决方案非常棒,而且非常优雅

我想我们应该避免在第一行中说
var
,然后再初始化变量。通常,使用复杂初始值设定项立即初始化值的方法是使用定义和调用构造:

let value: String = {
    do {
        return try getValue()
    } catch {
        return "Default Value"
    }
}()
如果
catch
块返回您想要捕获的
error
信息,您可能会希望这样做


但是,在这种情况下,如果忽略错误的性质,则表达式要紧凑得多,并且精确地执行您想要执行的操作
try?
将返回一个可选值,如果我们成功,该值将被展开;如果我们失败,该值将返回
nil
,并使用备用值(
“默认值”

我认为没有其他更简单的解决办法。如果让value=try,您可以使用
?getValue(){
但这只是您的第一个版本的另一个变体。问题是什么?@matt有更好的方法吗?我正在尝试以快速的方式进行操作,而不是混合使用Javascript(节点)了解Swift语言。第二种解决方案较短,但抛出函数会提供错误信息。只有第一种方法才能提供错误信息。@Wainage这就是为什么在我下面的回答中,我解释了
try?
的工作原理,只是为了确保你掌握了你正在做的事情(并且让你看到它是正确的).如果我错了,请纠正我,但这本质上是一个立即调用的lambda?这非常巧妙,尤其是当您需要处理不同的错误时。“这本质上是一个立即调用的lambda”当然是你的口齿不清。更多的讨论来自我,这里:和这里:感谢你的链接,并使这些信息提供给社区。我一定会仔细阅读它。