我有一个我在各种应用程序中使用的日志功能。由于我在整个应用程序中使用它,因此它还可以方便地进行Crashlytics日志调用。
然而,并非每个应用都使用Crashlytics。在Objective C中,您可以使用预处理器条件来处理这个问题。
如何在代码中处理此问题?我认为有很多方法可以使函数有条件。但是我如何选择或弱导入Crashlytics?
import Foundation
//import Crashlytics
/// Debug Log: Log useful information while automatically hiding after release.
func DLog<T>(message: T, filename: String = __FILE__, function: String = __FUNCTION__, line: Int = __LINE__) {
// CLSLogv("\(NSString(string: filename).lastPathComponent).\(function) line \(line) $ \(message)", getVaList([]))
print("[\(NSString(string: filename).lastPathComponent) \(function) L\(line)] \(message)")
}
答案 0 :(得分:3)
我会在Swift中采用不同的方式。我会使我的日志功能可扩展。我会有一个日志闭包数组来进行实际日志记录,而我的dlog
函数会调用所有日志闭包,例如。
private var logFunctions: [(String) -> ()] = [ { print($0) } ]
func dlog(message: String, filename: String = __FILE__, function: String = __FUNCTION__, line: Int = __LINE__)
{
let logMessage = "[\(NSString(string: filename).lastPathComponent) \(function) L\(line)] \(message)"
for log in logFunctions
{
log(logMessage)
}
}
dlog("Hi", filename: "file", function: "function", line: 1)
print("---")
logFunctions.append{ print("New print: " + $0) }
dlog("Hi", filename: "file", function: "function", line: 2)
输出
[file function L1] Hi
---
[file function L2] Hi
New print: [file function L2] Hi
因此,在任何支持Crashlytics的应用程序中,在您的应用程序启动代码中,您将崩解剂记录器添加到您的记录器阵列,即
import Crashlytics // Only needed in the Swift file with app start up code
// ...
logFunctions.append{ CLSLogv($0, getVaList([])) }
当然,您应该将所有上述内容封装在一个类或其他内容中。
答案 1 :(得分:1)
您现在可以使用新的canImport()指令在Swift 4.1中执行此操作。这是描述其工作原理的Swift Evolution提案:https://github.com/apple/swift-evolution/blob/master/proposals/0075-import-test.md
所以你可以这样做:
#if canImport(Crashlytics)
func dLog() {
// use Crashlytics symbols
}
#endif
答案 2 :(得分:0)
即使Swift编译器不包含预处理器,这在Swift中也是可能的。
import Foundation
#ifdef DEBUG
import Crashlytics
#endif
/// Debug Log: Log useful information while automatically hiding after release.
func DLog<T>(message: T, filename: String = __FILE__, function: String = __FUNCTION__, line: Int = __LINE__) {
#ifdef DEBUG
CLSLogv("\(NSString(string: filename).lastPathComponent).\(function) line \(line) $ \(message)", getVaList([]))
#else
print("[\(NSString(string: filename).lastPathComponent) \(function) L\(line)] \(message)")
#endif
}
现在,以下代码未经测试,可能需要进行一些调整 - 但如果您想清理代码,它可以提供帮助!顺便说一句,@ transparent会内联代码的主体。
import Foundation
#ifdef DEBUG
import Crashlytics
@transparent printfn(item: String) {
CLSLogv(item, getVaList([])
}
#else
let printfn = println
#endif
/// Debug Log: Log useful information while automatically hiding after release.
func DLog<T>(message: T, filename: String = __FILE__, function: String = __FUNCTION__, line: Int = __LINE__) {
printfn("\(NSString(string: filename).lastPathComponent).\(function) line \(line) $ \(message)")
}
请注意:您必须设置“DEBUG”符号,因为它未预定义。将它设置在编译器的“Swift编译器 - 自定义标志”部分,“其他Swift标志”行。您可以使用-D DEBUG条目来识别DEBUG符号。 希望我能帮忙!