【问题标题】:Replace Objective-C function-like macros in bridging header file for Swift?在 Swift 的桥接头文件中替换 Objective-C 类函数宏?
【发布时间】:2014-12-11 06:20:31
【问题描述】:

我在一个 Swift iOS 应用程序项目中使用来自多个 iOS Cocoa 静态库项目的 Objective-C 代码。

桥接头文件中包含的一个 Objective-C 头文件定义了用于调用自定义日志记录类的类似函数的宏。

#define LOGGER_DEBUG(FORMAT, ...)   [Logger logWithLevel:ASL_LEVEL_DEBUG   file:__FILE__ line:__LINE__ format:FORMAT, ##__VA_ARGS__, nil]
#define LOGGER_ERR(FORMAT, ...)     [Logger logWithLevel:ASL_LEVEL_ERR     file:__FILE__ line:__LINE__ format:FORMAT, ##__VA_ARGS__, nil]
#define LOGGER_INFO(FORMAT, ...)    [Logger logWithLevel:ASL_LEVEL_INFO    file:__FILE__ line:__LINE__ format:FORMAT, ##__VA_ARGS__, nil]
#define LOGGER_WARNING(FORMAT, ...) [Logger logWithLevel:ASL_LEVEL_WARNING file:__FILE__ line:__LINE__ format:FORMAT, ##__VA_ARGS__, nil]

#define LOGGER_ERR_ERROR(ERROR) [Logger logWithLevel:ASL_LEVEL_ERR file:__FILE__ line:__LINE__ format:(ERROR).description, nil]

我可以在桥接头文件中定义等效的 Swift 函数吗?如果可以,正确的语法是什么?

【问题讨论】:

    标签: objective-c swift c-preprocessor


    【解决方案1】:

    我所做的是创建一个返回#define 的类方法。

    示例:

    .h 文件:

    #define LOGGER_DEBUG(FORMAT, ...)   [Logger logWithLevel:ASL_LEVEL_DEBUG   file:__FILE__ line:__LINE__ format:FORMAT, ##__VA_ARGS__, nil]
    + (void)LoggerDebug:(NSString*)s;
    

    .m 文件:

    + (void)LoggerDebug:(NSString*)s                { LOGGER_DEBUG(@"%@", s); }
    

    在 Swift 中:

    由于这是一个类方法,您现在几乎可以像使用#define 一样使用它。如果你改变你的#define 宏——它将反映在你在 Swift 中创建的新方法中:

    let size = YourClass.LoggerDebug("Test")
    

    【讨论】:

    • 这是否针对示例中的签名进行了扩展,是否可以将定义放在桥接头文件中(或静态库项目的任何“客户端”都会看到它们的其他地方)?跨度>
    • 我更新了示例代码以适应问题 - 希望对您有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多