🎁 解包一个可选值,如果为 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