在 Swift 中,編譯器為我們準(zhǔn)備了幾個(gè)很有用的編譯符號(hào),用來處理類似這樣的需求卷哩,它們分別是:
符號(hào) | 類型 | 描述 |
---|---|---|
#file | string | 包含這個(gè)符號(hào)的文件的路徑 |
#line | Int | 符號(hào)出現(xiàn)處的行號(hào) |
#column | Int | 符號(hào)出現(xiàn)處的列 |
#function | String | 包含這個(gè)符號(hào)的方法名字 |
因此,我們可以通過使用這些符號(hào)來寫一個(gè)好一些的 Log 輸出方法:
func printLog<T>(message: T,
file: String = #file,
method: String = #function,
line: Int = #line)
{
print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
}
這樣属拾,在進(jìn)行 log 的時(shí)候我們只需要使用這個(gè)方法就能完成文件名将谊,行號(hào)以及方法名的輸出了。最棒的是渐白,我們不再需要對這樣的輸出進(jìn)行維護(hù)尊浓,無論在哪里它都能正確地輸出各個(gè)參數(shù):
// Test.swiftfunc
method()
{
printLog("這是一條輸出")
}
// 輸出:Test.swift[62], method(): 這是一條輸出
另外,對于 log 輸出更多地其實(shí)是用在程序開發(fā)和調(diào)試的過程中的纯衍,過多的輸出有可能對運(yùn)行的性能造成影響栋齿。在 Release 版本中關(guān)閉掉向控制臺(tái)的輸出也是軟件開發(fā)中一種常見的做法。如果我們在開發(fā)中就注意使用了統(tǒng)一的 log 輸出的話,這就變得非常簡單了瓦堵。使用條件編譯的方法基协,我們可以添加條件,并設(shè)置合適的編譯配置菇用,使 printLog的內(nèi)容在 Release 時(shí)被去掉澜驮,從而成為一個(gè)空方法:
func printLog<T>(message: T,
file: String = #file,
method: String = #function,
line: Int = #line)
{ #if DEBUG
print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
#endif
}
新版本的 LLVM 編譯器在遇到這個(gè)空方法時(shí),甚至?xí)苯訉⑦@個(gè)方法整個(gè)去掉惋鸥,完全不去調(diào)用它杂穷,從而實(shí)現(xiàn)零成本。