【问题标题】:Xcode 6 / Beta 4: using bridging headers with framework targets is unsupportedXcode 6 / Beta 4:不支持将桥接头与框架目标一起使用
【发布时间】:2014-09-12 14:05:07
【问题描述】:

我刚刚升级到 Xcode 6 Beta 4,并有一个我为 Beta 2 中的实时视图创建的框架。由于另一个 swift bug,我需要使用一些 Obj-C 代码。但是在升级时,我收到以下错误:

错误:不支持将桥接头与框架目标一起使用

我没有在发行说明中看到任何内容,也没有找到任何其他迁移路径。有没有其他人看到这个并找到解决方案?

我意识到 Beta 3 消除了对实时视图框架的需求,但在我的情况下,如果我能让它发挥作用是有意义的。我可以将它作为后备删除,但如果它们在 Beta 4 中没有完全损坏,我更愿意使用框架。

【问题讨论】:

  • “我意识到 Beta 3 消除了对框架的需求”。怎么样?
  • (用于实时取景)- 已编辑
  • 我遇到了同样的问题。
  • 哇,你的小编辑让我的生活变得更好了——在任何地方都没有听说过这种变化(消除了对框架的需求),并且正在用所有这些框架目标来实现实时视图用了几个小时。非常感谢@chrisco!

标签: xcode frameworks beta


【解决方案1】:

由于错误状态,框架中不允许使用桥接头。 Mix & Matchapple 文档的 Importing Code from Within the Same Framework Target 部分暗示了这一点。正如他们所说,您需要“在您的总括头文件中,导入您想要公开给 Swift 的每个 Objective-C 头文件”。

但是,我发现您可能还需要公开这些特定的标头。这个答案回顾了为什么以及如何做到这一点:Swift compiler error: "non-modular header inside framework module"

所以,这样做:

  1. 删除您的桥接头文件。
  2. 在框架的构建设置中删除对桥接头文件的引用
  3. 将必要的标题添加到您的伞形文件 ([ProductName].h)
  4. 在框架的“构建阶段”的“标题”部分中公开包含的文件。
  5. 清理并重建。

注意:“伞形头文件”是一个文件(名为 [ProductName].h),通常代表框架的所有公共头文件。它通常只是框架中包含的其他标头的#import 语句列表。在 Xcode 中,如果您打开 UIKit.h,您会看到一个很好的伞形文件示例。

【讨论】:

  • 感谢简洁的回答(标记为这样)。我已经阅读了该部分,但对 Umbrella 和 Bridging header 之间的区别感到困惑。
  • @zaxy78 查看本文档的“将 Swift 导入 Objective-C”部分:developer.apple.com/library/ios/documentation/Swift/Conceptual/…
  • @DeepFriedTwinkie,当你说:“将必要的标题添加到你的伞形文件中”时,你指的是什么伞形文件?谢谢。
  • 这正是我所需要的。将它们添加到公共部分是解决方法。
  • 我是否正确假设我想在我的框架中保持私有的任何类必须由 swift 类使用现在必须对使用我的框架的任何人公开?似乎不是一个理想的解决方案。
【解决方案2】:

有两种可能。将必要的头文件添加到总括头文件中并将它们公开是一种方法。但是,如果标头应该对 Swift 可用,但不公开,这将是一个问题。

here 中详细描述了使内部标头可用于 Swift 的第二种可能性。本质上,需要创建类似于以下的模块映射:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

然后可以使用以下设置将其包含在 XCode 中:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

【讨论】:

  • 太棒了!谢谢。比公开所有标题更受欢迎的技术。
  • 强烈建议该解决方案与其他解决方案相比,并查看提供的详细解决方案链接
  • 这是 imo 的正确答案,但取决于您想要实现的目标,您可能可以使用一些 Apple 提供的宏,这些宏对 Swift-Objc 互操作有很大帮助:@987654322 @
  • header 语句接受相对路径。当你想添加另一个框架的头部时,你会怎么做?
  • @Georgios 回退到伞头方法(如果从 another 框架导入 public 标题,请不要使用此方法)
【解决方案3】:

Importing Objective-C into Swift

将 Objective-C 代码从同一框架导入 Swift

  1. 在打包的构建设置下,确保该框架目标的定义模块设置设置为“是”。
  2. 在您的总括头文件中,导入您想要向 Swift 公开的每个 Objective-C 头文件。例如:

    #import "XYZ/XYZCustomCell.h" #import "XYZ/XYZCustomView.h" #import "XYZ/XYZCustomViewController.h"
  3. 在框架的“构建阶段”的“标题”部分中公开包含的文件。

  4. 清理并重建。

Swift 将看到您在伞形标题中公开公开的每个标题。该框架中的 Objective-C 文件的内容将自动在该框架目标内的任何 Swift 文件中可用,无需任何导入语句。使用与系统类相同的 Swift 语法使用自定义的 Objective-C 代码。

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

重要提示:“伞形头文件”是指文件 {ModuleName}.h。 顺便说一句,目标名称是 {ModuleName}.framework。

【讨论】:

  • 我想在我的模块 Swift 文件中使用 objc 文件,但我不想将它们暴露给其他模块。我该怎么做?
  • 嗨@SazzadHissainKhan,你解决了你的问题了吗?我正在努力解决同样的问题。我希望我的 objc 标头对 Swift 可见但不暴露给外部世界
  • @Ivan 我真的记不清我做了什么。我希望这个问题已经在以后的 Swift 版本中得到解决。
【解决方案4】:

就我而言,只需从框架的 Build Settings 中删除 Objective-C Bridging Header 设置即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2020-06-23
    • 2023-03-29
    • 2014-12-30
    • 2015-08-08
    相关资源
    最近更新 更多