快速返回或投掷

时间:2018-03-08 07:40:55

标签: swift exception

以下模式在我的代码中的某些地方很常见,但它感觉不到Swifty:

if let res = calcSomething() {
    return res
} else {
    throw err.invalidSomething
}

英文:如果calcSomething()返回非零值,则返回return calcSomething() ?? throw err.invalidSomething 的calue,否则抛出异常。

我希望看到如下结构:

{{1}}

但到目前为止没有找到类似的东西。我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

我认为你不能在回复声明中使用null coalesce。但是,你可以做这样的事情

guard let res = calcSomething() else { throw err.invalidSomething }
return res

答案 1 :(得分:1)

对于这种情况,我宁愿使用guard语句,因此它类似于:

func myFunction() throws {
    guard let res = calcSomething() else {
        throw err.invalidSomething
    }

    // keep going now...

    // if something went wrong, you might want to throw another error:
    throw err.invalidSomething

    // if everything is ok:
    return res
}

如果guardcalcSomething(),则nil会直接抛出所需的错误,从而退回调用该函数。

关于return calcSomething() ?? throw err.invalidSomething

在实现这样一个函数时似乎是一个明显的目标,但是有些人认为它对语言来说不那么合乎逻辑,因为nil-coalescing operator??):

  

nil-coalescing运算符(a ?? b)展开一个可选的a if   包含值,如果a为nil ,则返回默认值b。该   表达式a始终是可选类型。表达式b必须   匹配存储在。

中的类型      

nil-coalescing运算符是下面代码的简写:

     
    

a != nil ? a! : b

  

这意味着它returns一个值作为结果; throw err.invalidSomething 要返回的值,而是出现错误导致错误的例外情况。