2017-04-07 57 views
2

我想使用的功能名稱,以解決一些問題,但#function似乎沒有與@inline(__always)很好地工作,這是我的代碼:如何在`inline`函數中使用`#函數'符號?

@inline(__always) func log() { 
    print(#function) 
} 
func a() { log() } // want 'a()', but got 'log()' 
func b() { log() } 
func c() { log() } 
//... 

有人能解釋一下嗎?或者那只是一個愚蠢的想法。

回答

3

如果你的目的是要打印的要求 log()函數的名稱,那麼你應該把它作爲默認參數(在調用者的上下文中計算 ),如雨燕博客證實 在Building assert() in Swift, Part 2: __FILE__ and __LINE__

實施例:

@inline(__always) func log(_ message: String, callingFunction: String = #function) { 
    print("\(callingFunction): \(message)") 
} 

func a() { log("Hello world") } 
func b() { log("Foo") } 
func c() { log("Bar") } 

a() // a(): Hello world 
b() // b(): Foo 
c() // c(): Bar 

這工作不管log功能是否被內聯或沒有。 (內聯不改變程序的語義。特別地,它 並不意味着的func log的源代碼是從 包含的func a()源代碼和編譯爲一個單一的功能。)

+0

但是直列@inline調試版本中的屬性被忽略(優化關閉時)。你能解釋一下爲什麼我們可以使用你在操場上的代碼或調試版本? –

+0

是的,這就是我最終解決問題的方式,我感到困惑的是,它應該是每個函數的名稱,對吧?因爲我們在這裏有一個 '@inline(__ always)'符號,我誤解了'inline'的概念嗎?對不起我的英語不好,我不是母語... – jianstm

+0

@OlegGordiichuk:OP想要一個日誌功能,打印其調用函數的名稱,這就是它的工作原理。函數是否內聯並不重要。 –

相關問題