objective-c - 有什么方法可以告诉我从哪个类/方法调用了一个方法?

标签 objective-c swift c-preprocessor

我有一个像这样使用的预处理器宏:

@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/

相关文章:

iOS 7 使用 AVPlayer 在锁定屏幕上倒回歌曲

objective-c - Objective C - 调节GDC线程以限制CPU使用

ios - 按下“完成”按钮时 PickerView 不会关闭

ios - Swift - 无法将函数转换为泛型

c - 我应该在标题中使用#include吗?

c - 如何检查参数是否是 C 预处理器宏中的整型常量表达式?

objective-c - 如何为自定义 View 设置 canBecomeFocused

mysql - 是否可以在 GET 请求中返回流利的 child ?

ios - 如何快速同时显示表格 View 单元格索引路径和 Collection View 索引路径?

c - "#include"C 程序中作为 char[] 的文本文件