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

时间:2014-07-21 22:15:34

标签: xcode frameworks beta

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

  

错误:不支持使用带有框架目标的桥接标头

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

我意识到Beta 3消除了对实时视图框架的需求,但在我的情况下,如果我可以让它工作,这是有道理的。我可以删除它作为后备,但如果它们在Beta 4中没有完全破坏,我宁愿使用框架。

4 个答案:

答案 0 :(得分:197)

如错误所述,框架中不允许桥接标头。 Mix & Match Apple文档中的从同一框架目标中导入代码部分提示此处。正如他们所说,你需要"在你的伞头文件中,导入你想要暴露给Swift"的每个Objective-C头。

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

所以,这样做:

  1. 删除桥接头文件。
  2. 删除框架
  3. 的构建设置中对桥接头文件的引用
  4. 将必要的标题添加到您的伞文件([ProductName] .h)
  5. 在框架中公开包含的文件" Headers"其部分"构建阶段"。
  6. 清理并重建。
  7. 注意:"伞头文件"是一个文件(名为[ProductName] .h),通常表示框架的所有公共标头。它通常只是框架中包含的其他头文件的#import语句列表。在Xcode中,如果你打开UIKit.h,你会看到一个伞文件的好例子。

答案 1 :(得分:18)

有两种可能性。向伞头文件添加必要的标题并将其公开是一种方法。但是,如果标题应该可供Swift使用,而不是公开,则会出现问题。

第二种可能使Swift可用于内部标题的可能性将在here中详细介绍。基本上,需要创建类似于以下的模块映射:

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

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

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

答案 2 :(得分:9)

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. 清理并重建。

  5. Swift会看到您在伞形标题中公开展示的每个标题。该框架中的Objective-C文件的内容将自动在该框架目标中的任何Swift文件中提供,而不包含任何import语句。使用您自定义的Objective-C代码,使用与系统类相同的Swift语法。

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

    重要:"伞头文件"表示文件{ModuleName} .h。  顺便说一句,目标名称是{ModuleName} .framework。

答案 3 :(得分:0)

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

enter image description here