Safeguard 是一个轻量级框架,它扩展了 Optional
并集成到您现有的日志系统中,以帮助您识别在 Swift 的 guard
语句中丢失的问题。
Safeguard 被设计为帮助那些在 guard
语句保护应用程序免于崩溃时对日志记录(以及/或者使用自定义处理)感兴趣的人。
根据 Swift 的约定,guard
允许我们作为开发者确保在执行代码块之前某些条件已经存在。然而,它并不让您知道这个问题是否已经发生,除非您已经仔细地处理了每个 guard
语句的 else
部分。通过在您的代码的关键区域利用 Safeguard 的 safeguard()
函数,它帮助您轻松捕获并记录这些静默失败,以便您在使用户惊慌之前就能了解并捕捉到这些问题。
import Safeguard
let optionalString: String? = "Hi there"
let anotherString: String? = nil
func testFunction() {
guard let optionalString = optionalString.safeguard(),
let anotherString = anotherString.safeguard("anotherString") else {
return
}
print("This is \(optionalString) and \(anotherString) in a sentence.")
}
testFunction() // Logs label (passed as "anotherString" here), filename, caller/function name, line # for anotherString, and type (String here)
通过将级联 let
语句分离到单独的行中,我们可以记录 guard 语句中具体失败赋值/展开的行号。没有这个,可能很难判断是哪个展开失败。
在您的 AppDelegate
文件或 AppConfigurator
(根据您的应用程序启动时的设置)中,设置 Safeguard 的理想位置是在 application(didFinishLaunchingWithOptions:)
中。简单地在上面的 AppDelegate
文件顶部添加 import Safeguard
并调用 Safeguard 的 configure()
函数(请看下面的示例。) 所有参数都是 Optional
的,并有默认值 nil
,这允许您在每次调用 configure()
时灵活地仅配置单个参数。传递给 Safeguard 的参数为 nil
或在 configure()
函数中留空,将不会进行修改。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
Safeguard.configure(logger: myLogger, customLoggingParams: safeguardParams, nilHandler: safeguardNilHandler)
return true
}
默认情况下,没有设置记录器。您可以通过创建一个实例并将其传递到 Safeguard 的 configure()
函数来使用我们基本的控制台记录器 SafeLogger
。
let myLogger = SafeLogger()
如果您对控制台日志的需求之外,我们建议使用更强大的日志记录器(在这里我们使用Instacart的Willow
)。如果您的现有日志记录器符合Safeguard的SafeLoggable
协议,您可以将其作为参数传递给Safeguard的configure()
函数。
Safeguard在配置时接受一个[String: Any]
参数,可以在日志记录时传递额外有用的信息,例如自定义会话信息。如果没有在这里传递任何内容,则只会记录默认参数,这些参数包括:#file
、#line
、#function
和Wrapped.Type
。
let safeguardParams: [String: Any] = ["Crazy": "Info"]
最后,configure()
函数接受一个可选的nilHandler
,它是一个闭包,接受一个Bool
并返回空值 - ((Bool) -> Void)?
。日志记录执行后,如果非nil,此方便回调会在Optional
解包失败时被调用。如果您的预处理器宏已设置DEBUG标志,您还可以得到应用程序是否在DEBUG模式下运行的额外信息(如果没有设置标志,则默认为false,仅供参考。)
此回调对于您可能想要引发崩溃或在设计时显示警告的场景非常有用,这样您可以确保立即注意到问题。
let safeguardNilHandler: (Bool) -> Void = { isDebug in
if isDebug {
assertionFailure()
}
}
这就是所有的内容,祝您快乐地进行safeguard()
操作!
太棒了!这里有几种方式您可以帮忙