swift2 Swift中的条件导入

avwztpqn  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(210)

我有一个日志功能,我在各种应用程序中使用。它的方便,这也使崩溃日志调用,因为我在整个应用程序中使用它。
然而,并不是每个应用程序都使用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)")
}
js81xvg6

js81xvg61#

现在,你可以在Swift 4.1中使用新的canImport()指令来实现这一点。下面是Swift Evolution的建议,描述了它的工作原理:https://github.com/apple/swift-evolution/blob/master/proposals/0075-import-test.md
因此,您可以执行以下操作:


# if canImport(Crashlytics)

func dLog() { 
    // use Crashlytics symbols 
}

# endif
3b6akqbq

3b6akqbq2#

在Swift中我会用不同的方式来做,我会让我的log函数具有可扩展性,我会有一个log闭包数组来做实际的日志记录,我的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的应用程序中,在应用程序启动代码中,您可以将Crashlytics记录器添加到记录器阵列中,即

import Crashlytics // Only needed in the Swift file with app start up code

// ...

logFunctions.append{ CLSLogv($0, getVaList([])) }

当然,您应该将上述所有内容封装在一个类中。

jgwigjjp

jgwigjjp3#

这在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”符号,因为它不是预定义的。2在编译器的“其他Swift标志”行的“Swift编译器-自定义标志”部分设置它。3你可以用-D DEBUG条目来定义DEBUG符号。4希望我能帮上忙!

相关问题