如何在Swift中使用Objective-C代码和#definemacros

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

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

我做了一些研究,看到“复杂的macros”下面的苹果文档说

“在Swift中,可以使用函数和generics来获得与复杂macros相同的结果,而不会有任何妥协。 因此,C和Objective-C源文件中的复杂macros不能用于Swift代码。“

读完之后,通过在Swift中指定let AD_SIZE = CGSizeMake(320, 50) ,我可以很好地工作,但是如果这些值在我不知情的情况下改变,我想保持与库的未来兼容性。

有没有一个简单的解决这个在Swift或我的桥接头? 如果没有,是否有办法replaceConstants.h#define AD_SIZE CGSizeMake(320, 50) ,并保持与使用旧的AD_SIZEmacros的现有Objective-C应用程序向后兼容?

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

例:

.h文件:

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

.m文件:

 + (CGSize)adSize { return AD_SIZE; } 

而在Swift中:

由于这是一个类方法,现在可以像使用#define那样使用它了。 如果你改变你的#definemacros,它将反映在你在Swift中创build的新方法中:

let size = YourClass.adSize()

我通过replace解决了这个问题

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

在Class声明之后编写你的常量。 喜欢这个…

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