🎁 解包一个可选值,如果为 nil 则抛出一个错误(或使程序崩溃)。
并非原创。解包或崩溃和解包或抛出的概念已经在 Swift 社区流传多年。您可以在下面的参考文献中阅读更多相关信息。
阅读更多:解包或抛出(或崩溃)
这个库提供了不同的工具来解包一个 Optional
。
Swift 提供了一种从 throwing 函数到 optional 的方法 `try?`,但它没有一种简单的方法来执行相反的操作。
Swift 的 throw
不是一个表达式,因此我们不能在合并运算符 ??
的右侧使用它。 raise
函数提供了此功能。 这是一个非常简单的函数,它抛出给定的错误,但它使其可以在需要表达式的地方使用。
try someWork() ?? raise(YourError())
提供了一个 ??
的重载,以消除对 raise
函数的需求。如果您喜欢简洁而不是显式,您只需在运算符的右侧使用一个错误,它就可以正常工作。
try someWork() ?? YourError()
如果您不喜欢滥用合并运算符来抛出错误,您可以改用方法变体。
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