2015-10-01 56 views
3

我在各種應用程序中使用了日誌功能。它的方便也使Crashlytics日誌記錄調用,因爲我在整個應用程序中使用它。Swift中的條件導入

但是,並不是每個應用程序都使用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

儘管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 compiler - Custom Flags」部分進行設置。您可以使用-D DEBUG條目來調試DEBUG符號。 希望我能夠幫助!

+0

調試標誌不能解決我的問題。我需要檢查Crashlytics的存在。不調試。 –

+0

Ryan,只要您在編譯器標誌部分定義它,您就可以用任何其他變量替換DEBUG。 –

+0

#ifdef已被替換爲#if https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID34 –

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的任何應用程序,在應用程序啓動代碼,你crashlytics記錄添加到您的記錄器的陣列,即

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

// ... 

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

中當然,你應該將所有上述內容封裝在一個類或其他類中。

+0

嗯有趣的方法肯定。 –

+0

@RyanPoolos我認爲它比嘗試模擬C預處理器要優越得多。 – JeremyP