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

ank*_*shg 28 macros objective-c ios swift

我正在尝试在我的Swift项目中使用第三方Objective-C库.我已经成功地将库导入到Xcode中,并且我创建了一个<Project>-Bridging-Header.h文件,允许我在Swift中使用我的Objective-C类.

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

我做了一些研究,发现Apple Complex文档中的Apple文档说明这一点

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

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

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

Yog*_*ton 12

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

例:

.h文件:

#define AD_SIZE CGSizeMake(320, 50)
+ (CGSize)adSize;
Run Code Online (Sandbox Code Playgroud)

.m文件:

+ (CGSize)adSize { return AD_SIZE; }
Run Code Online (Sandbox Code Playgroud)

在斯威夫特:

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

let size = YourClass.adSize()


ank*_*shg 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文件中.