我有一个像这样使用的预处理器宏:
@implementation MyClass
- (void)methodA
{
MyLog("Hello, method A!");
}
- (void)methodB
{
MyLog("Hello, method %@!", @"B");
}
@end
在宏扩展之后它看起来像:
@implementation MyClass
- (void)methodA
{
; NSLog([NSString stringWithFormat:@"%s - %@", __func__, "Hello, method A!"]); ;
}
- (void)methodB
{
; NSLog([NSString stringWithFormat:@"%s - %@", __func__, "Hello, method %@!"], @"B"); ;
}
@end
这将导致为它们各自的方法打印这些:
-[MyClass methodA] - Hello, method A! -[MyClass methodB] - Hello, method B!
我想将其更改为一组 Objective-C 或 Swift 方法,我可以用相同的方式调用它们并得到相同的结果。我不想管理一个对象,所以这些应该是类/静态方法。 是否可以告诉我我在特定的类/方法中并且只在其中使用特定的日志前缀?
如果不是,是否有任何其他方法可以使用方法来模仿我通过宏实现的行为?
最佳答案
通常,您在这里需要的 Swift 工具是 #function
。例如:
func MyLog(msg: String, function: StaticString = #function) {
print("\(function) - \(msg)")
}
#function
,当用作默认参数值时,计算为调用站点的函数。由于它是默认值,因此您不必传递 function
参数。
但是,这与 ObjC 不兼容。为此,您仍然需要宏。如果你想沿着 ObjC 宏转发到 Swift,你会做这样的事情:
#define MYLog(message) [Log log:message function:@(__FUNCTION__)]
然后你需要这样写MyLog
:
struct Log {
static func log(msg: String, function: String = #function) {
// ...
}
}
它必须在 struct
中才能被 ObjC 访问(或者它可以是一个枚举),并且你必须制作 String 类型的
而不是 function
StaticString
因为 ObjC 无法生成 StaticString
。
像这样构建,在 Swift 中,你会调用:
Log.log("my message")
在 ObjC 中你会调用
MyLog("my message")
关于objective-c - 有什么方法可以告诉我从哪个类/方法调用了一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37307192/