Swift3.0之自定義debug階段控制台打印


  本文講解在使用最新的Swift3.0語言進行ios開發的debug打印功能,並與Objective-C語言作對比。

  進行ios開發伊始,自然少不了要首先對項目進行各方面的配置,比如導入框架、配置info.plist、自定義后台打印等等,接下來首先使用Objective-C語言自定義后台打印,之后使用Swift3.0。

  Objective-C語言:

  首先要在項目中創建pch文件,使用command+n快捷鍵彈出新建文件窗口並選擇pch文件:

  之后配置項目將pch文件作為全局文件:

  上圖第5步中是設置prefix header文件的相對路徑,路徑是從項目的根目錄下的第一個目錄開始直到pch文件

  接下來就是在pch文件中實現自定義log的方法(當然還有一些全局變量的定義和預編譯,此處不作說明),代碼如下:

 

#ifdef DEBUG
#define YTLog(...) NSLog(@"%s\n %@\n\n", __func__, [NSString stringWithFormat:__VA_ARGS__])
//真機測試顯示打印的格式
#define YTRLog(FORMAT, ...) fprintf(stderr,"%s:%d   %s\n\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

#else
#define YTRLog(FORMAT, ...)
#endif

  有興趣的同學可以試着調用這個自定義的log打印結果

  下面介紹Swift自定義log的方法:

  與OC不同的是,Swift沒有所謂的pch文件,即時新建了也產生不了什么作用,而且Swift3.0也沒有預編譯命令#define,只能通過最新的語法來實現自定義log。

  首先依然是項目的配置,但卻不是配置pch文件的路徑,而是定義調試階段的flag變量,如圖:

  上圖中,在步驟5中寫入編譯階段debug的標識符,這里寫入了和OC一樣的標識符,之后就可以利用這個DEBUG標識符進行debug階段的判斷,從而杜絕Release階段的后台打印。

  然后,我們在項目中新建一個Swift的頭文件,可以在該文件中進行一些全局變量和全局函數的聲明和實現:

  在這里,我將該Swift頭文件命名為“SwiftPch”,因為這個文件是和OC的pch文件起着類似的作用,然后在該頭文件中,可以使用let、var、fun等關鍵字聲明一些全局變量和函數等,這里,我只做與自定義log有關的函數定義與實現:

//自定義調試階段log
    func delog(filePath: String = #file, rowCount: Int = #line) {
        #if DEBUG
            let fileName = (filePath as NSString).lastPathComponent.replacingOccurrences(of: ".Swift", with: "")
            print(fileName + "/" + "\(rowCount)" + "\n")
        #endif
    }

    func delog<T>(_ message: T, filePath: String = #file, rowCount: Int = #line) {
        #if DEBUG
        let fileName = (filePath as NSString).lastPathComponent.replacingOccurrences(of: ".Swift", with: "")    
            print(fileName + "/" + "\(rowCount)" + " \(message)" + "\n")
        #endif
    }

  這里,我實現了兩個自定義log的函數,一個是可以不帶打印信息參數的,一個是需要帶打印信息參數的。該函數的實現使用了Swift泛型的概念,因為我們知道需要打印的信息是任意類型的變量,而不僅僅是字符串。

  在系統的打印函數print中只是單純攜帶了需要打印的信息。而不包含任何其他信息,這對於一個龐大的項目來說是遠遠不夠的,相較於OC語言的打印函數NSLog中攜帶了時間信息,我們仍然需要一些對我們調試程序和定位bug十分有用的信息,比如文件名、調用的函數名以及打印的代碼的所在行數等等,至於時間信息,其實對於我們來說是完全無用的,我們完全可以用另一個強大的Xcode自帶調試工具Time profile來分析代碼的運行時間。在Swift3.0中,文件名、函數名、代碼函數這些信息分別使用代碼#file、#function、#line來實現,返回的類型分別是Swift的內置類型String、String和Int。

  在本例中,我只使用了#file、#line這兩個額外信息,因為對於#function來說,#line已經完全能夠定位到代碼的執行地點,#function未免過於冗長和多余,當然,這個只是個人偏好的問題,可以帶上也不可以選擇不帶上。在上例的函數中,我使用了自己配置的debug階段的標識符DEBUG,能夠在函數執行后,在debug階段打印想要的信息,在Release階段則什么都不做。另外,此處我對#file這個String變量做了額外的處理,在Swift中,#file是會返回一個文件所在的絕對路徑,這個路徑過於冗長,我們只需要其最后一個路徑即可,也就是先將其轉換為OC類型NSString,再截取最后一個路徑,之后,我刪除了最后文件名中的所有“.Swift”后綴,最終在大多數情況下我就只得到該文件名的類名。通過以上函數,最終我得到的打印輸出是這樣的:

delog()
delog(1)
delog("1")

playground31/15

playground31/16 1

playground31/17 1

   上3行是調用打印函數,下3行是控制台輸出,怎么樣,是不是看起來清爽很多?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM