Xcode 6/Beta 4: 不支持使用具有框架目标的桥接头

我刚刚升级到 Xcode 6 Beta 4,并在 Beta 2中创建了一个 Live 视图框架。由于另一个快速 臭虫,我需要使用一些 Obj-C 代码。但是在升级时,我得到了以下错误:

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

我在发布说明中没有看到任何内容,也没有发现任何其他迁移路径。有没有其他人看到这一点,并达成了解决方案?

我意识到 Beta 3消除了对实时视图框架的需求,但是对我来说,如果我能让它工作起来,那么它就是有意义的。我可以删除它虽然作为一个备用,但更愿意使用一个框架,如果他们没有完全破坏 Beta 4。

67067 次浏览

如错误所述,在框架中不允许桥接头。混搭 apple 文档的 从同一框架目标中导入代码部分暗示了这一点。正如他们所说,您需要“在您的伞头文件中,导入每个您想要暴露给 Swift 的 Objective-C 头”。

但是,我发现您可能还需要将这些特定的头部公开。这个答案回顾了为什么以及如何做到这一点: 快速编译器错误: “框架模块内非模块头”

所以,这样做:

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

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

参见 将 Objective-C 导入 Swift

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

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

    #import "XYZ/XYZCustomCell.h"
    #import "XYZ/XYZCustomView.h"
    #import "XYZ/XYZCustomViewController.h"
    
  3. Make the included files public in the framework's "Headers" section of its "Build Phases".

  4. Clean and rebuild.

Swift will see every header you expose publicly in your umbrella header. The contents of the Objective-C files in that framework will be available in any Swift file within that framework target automatically, without any import statements. Use your custom Objective-C code with the same Swift syntax you use with system classes.

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

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

有两种可能。将必要的头文件添加到伞头文件并使其公开是一种方法。但是,如果 Swift 可以使用标题,但是不能使用公共标题,那么这就是一个问题。

第二种可能性,将使内部报头提供给 Swift 详细描述了 给你。基本上,需要创建一个类似于下面的模块映射:

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

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

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule

在我的例子中,仅仅从框架的 Build Settings中移除 Objective-C Bridging Header设置就很有帮助。

enter image description here