一尘不染

如何在Swift中通过#define宏使用Objective-C代码

swift

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

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

我做了一些研究,发现“复杂宏”下面的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应用程序向后兼容?


阅读 232

收藏
2020-07-07

共1个答案

一尘不染

我通过替换解决了

#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文件中。

2020-07-07