首页 文章

如何在Swift中使用带有#define宏的Objective-C代码

提问于
浏览
25

我'm trying to use a third-party Objective-C library in a Swift project of mine. I have the library successfully imported into Xcode, and I'已经创建了一个 <Project>-Bridging-Header.h 文件,允许我在Swift中使用我的Objective-C类 .

然而,我似乎遇到了一个问题:Objective-C代码包含一个带有宏 #define AD_SIZE CGSizeMake(320, 50)Constants.h 文件 . 将 Constants.h 导入我的 <Project>-Bridging-Header.h 不会导致我的Swift应用程序可以使用的全局常量 AD_SIZE .

我做了一些研究,看到Apple文档here under "Complex Macros"

“在Swift中,您可以使用函数和泛型来实现与复杂宏相同的结果,而不会有任何妥协 . 因此,C和Objective-C源文件中的复杂宏不能用于Swift代码 . “

阅读完之后,我通过在Swift中指定 let AD_SIZE = CGSizeMake(320, 50) 使其工作正常,但是如果这些值在我不知情的情况下发生变化,我希望保持与库的未来兼容性 .

在Swift或我的桥接头中是否有一个简单的解决方案?如果没有,有没有办法替换 Constants.h 中的 #define AD_SIZE CGSizeMake(320, 50) ,并保持向后兼容任何使用旧 AD_SIZE 宏的现有Objective-C应用程序?

3 回答

  • 4

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

    例:

    .h file:

    #define AD_SIZE CGSizeMake(320, 50)
    + (CGSize)adSize;
    

    .m file:

    + (CGSize)adSize { return AD_SIZE; }
    

    And in Swift:

    由于这是一种类方法,您现在可以像使用#define一样使用它 . 如果更改#define宏 - 它将反映在您在Swift中创建的新方法中:

    let size = YourClass.adSize()

  • 5

    我通过更换来解决这个问题

    #define AD_SIZE CGSizeMake(320, 50)

    在图书馆的 Constants.h

    extern CGSize const AD_SIZE;

    并添加

    CGSize const AD_SIZE = { .width = 320.0f, .height = 50.0f };

    在库的 Constants.m 文件中 .

  • 10

    在Class声明后编写常量 . 像这样...

    class ForgotPasswrdViewController: UIViewController {
    let IS_IPHONE5 = fabs(UIScreen.mainScreen().bounds.size.height-568) < 1;
    let Tag_iamTxtf = 101
    

相关问题