【问题标题】:How to use Objective-C code with #define macros in Swift如何在 Swift 中使用带有 #define 宏的 Objective-C 代码
【发布时间】:2014-07-30 18:50:52
【问题描述】:

我正在尝试在我的 Swift 项目中使用第三方 Objective-C 库。我已将库成功导入 Xcode,并创建了一个 <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 应用程序向后兼容?

【问题讨论】:

  • 你试过用static CGSize代替宏吗?

标签: ios objective-c macros swift


【解决方案1】:

我通过替换解决了这个问题

#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】:

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

    例子:

    .h 文件:

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

    .m 文件:

    + (CGSize)adSize { return AD_SIZE; }
    

    在 Swift 中:

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

    让 size = YourClass.adSize()

    【讨论】:

      【解决方案3】:

      在类声明之后写下你的常量。像这样……

      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 具有相同的高度。
      猜你喜欢
      • 1970-01-01
      • 2014-08-11
      • 2014-08-04
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多