考虑OSLog
框架中的Logger
类:Logger
由于OSLog API不允许查询调用日志(log)命令的文件名、行和函数等信息,因此我希望将这些值"嵌入"到日志(log)条目本身中.
这可以通过在Logger
中添加新方法来轻松实现:
extension Logger {
func d_debug(_ message: @autoclosure () -> Any, _ file: String = #file, _ function: String = #function, line: Int = #line, context: Any? = nil) {
let converted = (file as NSString).lastPathComponent + ":" + String(line) + ":" + function + ": " + "\(message())"
debug("\(converted)")
}
}
这种方法的问题在于,我将不得不使用d_debug
方法,而不是默认使用的标准debug
方法.因此,这个修改后的方法将把实现细节"泄漏"到扩展之外.
我正在寻找一个选项来利用方法重载并使用不同的类型,即String
作为输入参数,这样我的方法将成为首选方法,而不是Logger
的原始LOG方法.
例如,原始签名如下所示:
///
/// - Warning: Do not explicity create OSLogMessage. Instead pass a string interpolation.
///
/// - Parameter message: A string interpolation.
public func debug(_ message: OSLogMessage)
然而,我希望有这样一种方法:
func debug(_ message: @autoclosure () -> String, _ file: String = #file, _ function: String = #function, line: Int = #line) {
并对调用点完全隐藏此方法的存在这一概念(如果可能).
理想情况下,如果我删除扩展,代码应该仍然是编译的.
有没有实现这一行为的 Select ?或者像这样的任何事情都会涉及到运行时的动态修补?