以下模式在我的代码中的某些地方很常见,但它感觉不到Swifty:
if let res = calcSomething() {
return res
} else {
throw err.invalidSomething
}
英文:如果calcSomething()
返回非零值,则返回return calcSomething() ?? throw err.invalidSomething
的calue,否则抛出异常。
我希望看到如下结构:
{{1}}
但到目前为止没有找到类似的东西。我错过了什么吗?
答案 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
}
如果guard
为calcSomething()
,则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
不要返回的值,而是出现错误导致错误的例外情况。