我刚刚升级到Xcode 6 Beta 4并拥有我为Beta 2中的实时视图创建的框架。由于另一个快速bug,我需要使用一些Obj-C代码。升级时,我收到以下错误:
错误:不支持使用带有框架目标的桥接标头
我没有在发行说明中看到任何内容,也没有找到任何其他迁移路径。还有其他人看过这个并找到了解决方案吗?
我意识到Beta 3消除了对实时视图框架的需求,但在我的情况下,如果我可以让它工作,这是有道理的。我可以删除它作为后备,但如果它们在Beta 4中没有完全破坏,我宁愿使用框架。
答案 0 :(得分:197)
如错误所述,框架中不允许桥接标头。 Mix & Match Apple文档中的从同一框架目标中导入代码部分提示此处。正如他们所说,你需要"在你的伞头文件中,导入你想要暴露给Swift"的每个Objective-C头。
但是,我发现您可能还需要将这些特定标头公开。这个答案回顾了为什么以及如何做到这一点:Swift compiler error: "non-modular header inside framework module"。
所以,这样做:
注意:"伞头文件"是一个文件(名为[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
在伞形头文件中,导入要向Swift公开的每个Objective-C标头。例如:
#import "XYZ/XYZCustomCell.h" #import "XYZ/XYZCustomView.h" #import "XYZ/XYZCustomViewController.h"
将包含的文件公开在框架"标题"其部分"构建阶段"。
清理并重建。
Swift会看到您在伞形标题中公开展示的每个标题。该框架中的Objective-C文件的内容将自动在该框架目标中的任何Swift文件中提供,而不包含任何import语句。使用您自定义的Objective-C代码,使用与系统类相同的Swift语法。
let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"
重要:"伞头文件"表示文件{ModuleName} .h。 顺便说一句,目标名称是{ModuleName} .framework。
答案 3 :(得分:0)