Fortify - 更强大的 Swift

Fortify 是一个小型的 Swift 包,它可以使 Swift 在面对目前会导致致命错误的场景(例如强制解包 nil 或类型转换错误)时更加健壮。

像使用现有的 Swift 异常一样使用 Fortify,只不过异常是为 Swift 错误自动生成的。错误被手动向上抛出堆栈,而无需中间函数声明为抛出。例如:

import Fortify

do {
    try Fortify.protect {
        var a: String!
        a = a!
    }
} catch {
    NSLog("Unwrap error: \(error)")
}

在该示例中,强制解包 nil 将会生成一个异常,而不是终止应用程序。要在 Xcode 中看到它运行,您需要在调试器之外运行示例应用程序。

有一个新的入口点 Fortify.protect(runLoop: Runloop.main),它尝试保护应用程序免于在主 RunLoop 中处理事件时发生的故障,在 fortifyUIKit 目标中。虽然它与 UIKit 的交互效果不佳,与 SwiftUI 的交互效果非常差。您可以使用它来防止应用程序的无序退出,但除了提供比崩溃更友好的错误对话框之外,不要用它做太多其他的事情。

注意

这种异常抛出形式相当粗暴,因为它不会清理中间帧中使用的活动对象、操作、锁或系统资源。 建议在非常重要的情况下不要崩溃,例如在开发 Swift 应用程序服务器时。 对于发生错误后应用程序的可靠性不做任何保证,尽管通常不良影响应仅限于内存和系统资源的泄漏。 更详细的关于 Fortify 如何工作以及它如何使用 setjmp/longjmp 的说明请点击这里