我'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 回答
我所做的是创建一个返回#define的类方法 .
例:
.h file:
.m file:
And in Swift:
由于这是一种类方法,您现在可以像使用#define一样使用它 . 如果更改#define宏 - 它将反映在您在Swift中创建的新方法中:
我通过更换来解决这个问题
#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声明后编写常量 . 像这样...