Swift中的条件导入

时间:2015-10-01 22:00:06

标签: swift module swift2

我有一个我在各种应用程序中使用的日志功能。由于我在整个应用程序中使用它,因此它还可以方便地进行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)")
}

3 个答案:

答案 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符号。 希望我能帮忙!