解包或抛出(或崩溃!)

Build and Test

🎁 解包一个可选值,如果为 nil 则抛出一个错误(或使程序崩溃)。

并非原创。解包或崩溃解包或抛出的概念已经在 Swift 社区流传多年。您可以在下面的参考文献中阅读更多相关信息。

阅读更多:解包或抛出(或崩溃)

用法

这个库提供了不同的工具来解包一个 Optional

Swift 提供了一种从 throwing 函数到 optional 的方法 `try?`,但它没有一种简单的方法来执行相反的操作。

使用 raise 进行合并

Swift 的 throw 不是一个表达式,因此我们不能在合并运算符 ?? 的右侧使用它。 raise 函数提供了此功能。 这是一个非常简单的函数,它抛出给定的错误,但它使其可以在需要表达式的地方使用。

try someWork() ?? raise(YourError())

使用 ?? 合并

提供了一个 ?? 的重载,以消除对 raise 函数的需求。如果您喜欢简洁而不是显式,您只需在运算符的右侧使用一个错误,它就可以正常工作。

try someWork() ?? YourError()

方法 unwrapOrThrow

如果您不喜欢滥用合并运算符来抛出错误,您可以改用方法变体。

try someWork().unwrapOrThrow(YourError())

该库带有一个默认错误:UnwrapError。 因此,您可以调用该方法而无需指定自定义错误。

try someWork().unwrapOrThrow()

☠️ 解包或崩溃

尽管库的名称如此,您也可以使程序崩溃而不是抛出错误。

您可以使用与抛出错误时相同的技术,但使用 fatalError("崩溃的原因") 代替

try someWork() ?? raise(fatalError("reason for crashing"))

编译器将在这一行显示警告 永远不会被执行,因此您可以直接在 ?? 运算符的右侧 fatalError 而不是使用 raise

try someWork() ?? fatalError("reason for crashing")

或者,如果您喜欢使用方法,也可以使用它

try someWork().unwrapOrThrow(fatalError("reason for crashing"))

这与强制解包 ! 具有相同的结果,但具有更好的错误消息,可以帮助您在日志中看到问题。

我很少使用解包或崩溃,因为当我想强制解包时,我就直接这样做了,而且我觉得大多数时候缺少适当的消息并不是问题。

这就是为什么我不需要引入一种直接将原因 String 传递到解包操作中的工具。

参考文献

作者

Alejandro Martinez | https://alejandromp.com | @alexito4