Macros Objective-C宏的快速替换

Macros Objective-C宏的快速替换,macros,swift,Macros,Swift,我正忙着在Swift中重写一个应用程序,并想将以下宏转换为Swift代码 #define FLOG(format, ...) NSLog(@"%@.%@ %@", [self class], NSStringFromSelector(_cmd), [NSString stringWithFormat:format, ##__VA_ARGS__]) 如何将其定义为一个Swift函数,以便我可以在任何地方使用它进行调试日志记录,或者是否有其他方法实现相同的目的?最简单的

我正忙着在Swift中重写一个应用程序,并想将以下宏转换为Swift代码

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

如何将其定义为一个Swift函数,以便我可以在任何地方使用它进行调试日志记录,或者是否有其他方法实现相同的目的?

最简单的方法可能是利用字符串插值并使用:

func FLOG(message:String, method:String = __FUNCTION__) {
    println("\(method): \(message)")
}
那么您的用法类似于:

FLOG("Illegal value: \(value)")
将方法参数默认为_函数_意味着它通常将被调用函数名替换。您可以使用的其他自动变量包括_文件_、_行_和_列_。不幸的是,“漂亮”功能不再可用

如果您希望对消息格式的控制超过字符串插值所允许的范围,请看一看在Swift中简化对printf样式格式的访问的示例,它将允许您执行以下操作:

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

另请参见苹果在assert中使用_文件_和_线_uu的地址

苹果对删除宏和替换宏的新方法的回答是,swift中没有类似宏的东西可用。最接近的方法是用全局let变量替换define

示例:您可以编写let CONSTANT=0,而不是定义常量0


然而,如果您想在宏中传递参数,该功能将不再可用,因为它被认为是糟糕的编程实践。您可以做的是创建一个函数

谢谢,我想这解决了方法部分,但是我们应该如何定义一个全局函数呢?大概我们不能像定义一个全局变量那样定义一个全局函数。最好用这个和其他帮助函数定义一个单例类吗?我只想将它定义为一个全局函数。真的没有理由不这样做。