如何在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_SIZE
macros的现有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