本文講解在使用最新的Swift3.0語言進行ios開發(fā)的debug打印功能,并與Objective-C語言作對比。
進行ios開發(fā)伊始帐姻,自然少不了要首先對項目進行各方面的配置,比如導入框架奶段、配置info.plist饥瓷、自定義后臺打印等等,接下來首先使用Objective-C語言自定義后臺打印痹籍,之后使用Swift3.0呢铆。
Objective-C語言:
首先要在項目中創(chuàng)建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泛型的概念,因為我們知道需要打印的信息是任意類型的變量葱轩,而不僅僅是字符串睦焕。
在系統(tǒng)的打印函數print中只是單純攜帶了需要打印的信息。而不包含任何其他信息靴拱,這對于一個龐大的項目來說是遠遠不夠的垃喊,相較于OC語言的打印函數NSLog中攜帶了時間信息,我們仍然需要一些對我們調試程序和定位bug十分有用的信息袜炕,比如文件名本谜、調用的函數名以及打印的代碼的所在行數等等,至于時間信息偎窘,其實對于我們來說是完全無用的乌助,我們完全可以用另一個強大的Xcode自帶調試工具Time profile來分析代碼的運行時間。在Swift3.0中评架,文件名眷茁、函數名、代碼函數這些信息分別使用代碼#file纵诞、#function上祈、#line來實現,返回的類型分別是Swift的內置類型String浙芙、String和Int登刺。
在本例中,我只使用了#file嗡呼、#line這兩個額外信息纸俭,因為對于#function來說,#line已經完全能夠定位到代碼的執(zhí)行地點南窗,#function未免過于冗長和多余揍很,當然郎楼,這個只是個人偏好的問題,可以帶上也不可以選擇不帶上窒悔。在上例的函數中呜袁,我使用了自己配置的debug階段的標識符DEBUG,能夠在函數執(zhí)行后简珠,在debug階段打印想要的信息阶界,在Release階段則什么都不做。另外聋庵,此處我對#file這個String變量做了額外的處理膘融,在Swift中,#file是會返回一個文件所在的絕對路徑祭玉,這個路徑過于冗長氧映,我們只需要其最后一個路徑即可,也就是先將其轉換為OC類型NSString脱货,再截取最后一個路徑屯耸,之后,我刪除了最后文件名中的所有“.Swift”后綴蹭劈,最終在大多數情況下我就只得到該文件名的類名疗绣。通過以上函數,最終我得到的打印輸出是這樣的:
delog()delog(1)delog("1")playground31/15playground31/16 1playground31/17 1
上3行是調用打印函數铺韧,下3行是控制臺輸出多矮,怎么樣,是不是看起來清爽很多哈打?