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

时间:2014-06-10 05:45:23

标签: ios objective-c macros 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不会导致我的Swift应用可以使用的全局常量AD_SIZE

我做了一些研究,发现Apple文档here under "Complex Macros"说明了

  

“在Swift中,您可以使用函数和泛型来实现相同的功能   结果[作为复杂的宏]没有任何妥协。因此,   不会生成C和Objective-C源文件中的复杂宏   适用于您的Swift代码。“

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

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

3 个答案:

答案 0 :(得分:10)

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

示例:

.h文件:

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

.m文件:

+ (CGSize)adSize { return AD_SIZE; }

在Swift中:

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

  

让size = YourClass.adSize()

答案 1 :(得分: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文件中。

答案 2 :(得分:4)

在Class声明后编写常量。像这样...

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