2014-10-03 40 views
1

我忙於在Swift中重寫應用程序,並想將下面的宏轉換爲Swift代碼。Objective-C宏的快速替換

#define FLOG(format, ...)    NSLog(@"%@.%@ %@", [self class], NSStringFromSelector(_cmd), [NSString stringWithFormat:format, ##__VA_ARGS__]) 

我如何定義這是一個斯威夫特功能,這樣我可以在任何地方是否有實現同樣的事情的另一種方法使用調試日誌記錄的目的,還是?

回答

0

最簡單的方法可能是採取串插和使用優勢:

func FLOG(message:String, method:String = __FUNCTION__) { 
    println("\(method): \(message)") 
} 

然後你使用類似:

FLOG("Illegal value: \(value)") 

具有方法參數默認爲__FUNCTION__意味着它將通常用調用函數名稱替換。您可以使用的其他自動變量包括__FILE____LINE____COLUMN__。不幸的是__PRETTY_FUNCTION__不再可用。

如果你想在比字符串插值允許消息的格式更多的控制,看看this question這表明簡化對printf風格的格式在斯威夫特,並且將讓你做:

FLOG("Illegal value: %x" % [value]) 

又見蘋果this post,解決使用__FILE____LINE__assert

+0

謝謝我想解決的方法部分,但如何定義一個全局函數 - 大概不能像定義一個全局變量一樣定義一個全局函數。用這個(和其他幫助器)函數定義一個Singleton類是否最好? – 2014-10-04 02:23:32

+0

我只是將其定義爲全局函數。 Theres真的沒有理由不。 – 2014-10-04 04:25:40

0

蘋果的答案去除宏和一些新的東西來替代它們的是什麼樣的宏將在迅速可用。你可以得到的最接近的是用一個全局的let變量替換#define。

例:不是的#define恆爲0,你可以寫讓常量= 0

然而,如果你想傳遞一個宏內部參數,該功能將不再可作爲考慮不好的編程習慣。你可以做的是創建一個函數。