在開(kāi)發(fā)過(guò)程中戳杀,打印Log進(jìn)行調(diào)試是必不可少的,但是在上線(xiàn)之后這些Log會(huì)很消耗性能資源夭苗,同時(shí)我們又想在Log中顯示更詳細(xì)的信息信卡,在Debug模式下打印,在Release模式下不打印题造。接下來(lái)就來(lái)說(shuō)一下在OC和Swift中來(lái)是如何實(shí)現(xiàn)這個(gè)功能的傍菇。
OC中自定義Log打印信息
在OC中我們可以使用宏定義來(lái)設(shè)置工程Debug模式下打印log,Release模式下不打印Log界赔,通常我們會(huì)定義在PCH文件中(點(diǎn)擊查看如何創(chuàng)建PCH文件)丢习。
//自定義Log輸入日志+顯示行號(hào)
#ifdef DEBUG //在調(diào)試模式下
#define MYLog(fmt, ...) NSLog((@"[Line-%d] %s " fmt), __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__)
#else //Release模式下
#define MYLog(...)
#endif // #ifdef 需要 #endif 結(jié)束
Debug和Release的切換用來(lái)控制MYLog的日志輸出
如上圖切換到Release即可取消在PCH文件中定義的MYLog的輸入日志。
func MYLog<T> (message: T, fileName: String = #file, funcName: String = #function, lineNum: Int = #line) {
#if DEBUG
let file = (fileName as NSString).lastPathComponent
print("\(file):\(funcName):\(lineNum):\("打印內(nèi)容"):\(message)")
#endif
}
Swifit中自定義Log打印信息
使用Swift我們發(fā)現(xiàn)淮悼,它的特性已經(jīng)不再具備像OC那樣的宏咐低,所以我們不能像上面那樣設(shè)置了,但我們可以通過(guò)下面的方式來(lái)實(shí)現(xiàn)和上面一樣的功能袜腥。
首先见擦,我們需要通過(guò)定義全局函數(shù)的形式來(lái)實(shí)現(xiàn)讓所有的類(lèi)都能調(diào)用。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//調(diào)用自定義Log
MYLog(message: "Hello")
return true
}
}
/// 自定義Log打印
///
/// - Description:
/// 考慮到自定義Log要打印方法所在的文件/方法名/行號(hào)羹令,以及自定義的內(nèi)容鲤屡,同時(shí)考慮調(diào)用的便捷性,所以要使用默認(rèn)參數(shù)(fileName: String = #file)福侈,因此無(wú)需調(diào)用者傳遞太多的參數(shù)酒来。
/// T 使用泛型,可以讓調(diào)用者傳遞任意的類(lèi)型肪凛,進(jìn)行打印Log的操作堰汉。
/// - Parameters:
/// - message: 需要打印的內(nèi)容
/// - fileName: 當(dāng)前打印所在文件名 使用#file獲取
/// - funcName: 當(dāng)前打印所在方法名 使用#function獲取
/// - lineNum: 當(dāng)前打印所在行號(hào) 使用#line獲取
func MYLog<T> (message: T, fileName: String = #file, funcName: String = #function, lineNum: Int = #line) {
#if DEBUG
let file = (fileName as NSString).lastPathComponent
print("-\(file) \(funcName)-[\(lineNum)]: \(message)")
#endif
}
這里需要說(shuō)明一下,在Swift中显拜,全局函數(shù)的概念是衡奥,將函數(shù)定義在任意一個(gè)文件的class外面爹袁,這樣即可在項(xiàng)目的任何地方都可以調(diào)用這個(gè)方法远荠。這里我們可以寫(xiě)在AppDelegata.swift的class{}外面,也可以單獨(dú)建立一個(gè)Swift文件失息,將MYLog方法寫(xiě)到里面譬淳。
另外档址,考慮到要在Debug模式下進(jìn)行打印,而在Release模式下不需要進(jìn)行打印邻梆。我們?cè)诖a中使用到了#if DEBUG #endif
守伸。由于Swift中沒(méi)有宏定義的概念,所以需要在項(xiàng)目的Build Settings->Other Swift Flags中為Debug添加一個(gè)標(biāo)記,例如"-D DEBUG"浦妄。
這樣尼摹,就可以在上面的代碼中,直接通過(guò)"DEBUG"這個(gè)關(guān)鍵詞剂娄,來(lái)判斷當(dāng)前的運(yùn)行環(huán)境是否為Debug模式蠢涝。
到這里即可像文章開(kāi)頭那樣,切換到DEBUG模式即可顯示Log打印信息阅懦,而在Release模式下不打印和二。