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

31
我正在尝试在我的 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 中并没有产生一个全局常量 AD_SIZE,供我的 Swift 应用程序使用。
我进行了一些研究,并看到苹果文档 这里,在“复杂宏”下面 中写道:
“在 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 应用程序的向后兼容性?”

1
你尝试过使用 static CGSize 而不是宏吗? - jtbandes
3个回答

14

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

例如:

.h 文件:

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

.m文件:

+ (CGSize)adSize { return AD_SIZE; }

在Swift中:

由于这是一个类方法,您现在可以几乎像使用#define一样使用它。 如果您更改了#define宏 - 它将反映在您创建的新方法中 在Swift中:

let size = YourClass.adSize()


6
我通过将库的Constants.h中的#define AD_SIZE CGSizeMake(320, 50)替换为extern CGSize const AD_SIZE;,并在库的Constants.m文件中添加CGSize const AD_SIZE = { .width = 320.0f, .height = 50.0f };来解决了这个问题。

4
在类声明之后编写您的常量。像这样...
class ForgotPasswrdViewController: UIViewController {
let IS_IPHONE5 = fabs(UIScreen.mainScreen().bounds.size.height-568) < 1;
let Tag_iamTxtf = 101

天啊,你认为有一款手机的高度是567.5像素吗?只需编写bounds.size.height == 568。并意识到你的宏命名不好,因为iPod Touch或iPhone 6/7在缩放模式下具有相同的高度。 - gnasher729

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接