2017-04-07 8 views
2

私はいくつかの問題を解決するために、関数の名前を使用したいが、@inline(__always)とうまく動作しない#functionようだと思い、ここに私のコードです:インライン関数で `#function`シンボルを使うにはどうすればいいですか?

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

誰も説明できますか?それは単なる愚かな考えです。あなたの意図は log()を呼び出す関数の名前を印刷する場合スウィフトブログでBuilding assert() in Swift, Part 2: __FILE__ and __LINE__で を実証したよう

答えて

3

、あなたは、(呼び出し元のコンテキストで 評価される)デフォルトの引数として渡す必要があります。

例:

@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デバッグビルドで(最適化がオフになっているとき)属性は無視されます。プレイグラウンドやデバッグビルドでコードを使用できる理由をplsに説明できますか? –

+0

はい、それは私が最後に問題を解決した方法です、私が混乱していたのは、各関数の名前であるはずです。 '@inline(__ always)'シンボルがあるので、私は 'inline'の概念を誤解しましたか?私の貧しい人のために申し訳ありませんが、私はネイティブスピーカーではありません。 – jianstm

+0

@OlegGordiichuk:OPは、呼び出し元の関数の名前を出力するログ関数を求めています。関数がインライン化されているかどうかは関係ありません。 –

関連する問題