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

Chr*_*ver 123 beta xcode frameworks

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

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

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

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

Dee*_*kie 212

如错误所述,框架中不允许桥接标头.在从在同一框架内目标导入代码中的部分混合&搭配苹果文档暗示了这一点.正如他们所说,你需要"在你的伞头文件中,导入你想要暴露给Swift的每个Objective-C头".

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

所以,这样做:

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

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

  • 我是否正确地假设我想在我的框架中保持私有的任何类必须由swift类使用,现在必须公开给任何使用我的框架的人?似乎不是一个理想的解决方案. (18认同)
  • @DeepFriedTwinkie,当你说:"在伞文件中添加必要的标题"时,你指的是什么样的伞文件?谢谢. (4认同)
  • @ospr - 也可以导入内部/私有类,请参见此处:http://nsomar.com/project-and-private-headers-in-a-swift-and-objective-c-framework/ (3认同)
  • 感谢简洁的答案(标记为这样).我已阅读该部分,但对于Umbrella和Bridging标头之间的区别感到困惑. (2认同)
  • 这正是我所需要的。将它们添加到公共部分是修复。 (2认同)

Jan*_*egg 22

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

第二个可能性,这将使内部接头提供给夫特详细描述这里.基本上,需要创建类似于以下的模块映射:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}
Run Code Online (Sandbox Code Playgroud)

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

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  
Run Code Online (Sandbox Code Playgroud)

  • 优秀!谢谢.比将所有标题公开的更多首选技术. (2认同)

Ral*_*ane 11

请参阅将Objective-C导入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文件中提供,而不包含任何import语句.使用与系统类相同的Swift语法使用自定义Objective-C代码.

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"
Run Code Online (Sandbox Code Playgroud)

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

  • 我想在我的模块 Swift 文件中使用 objc 文件,但我不想将它们暴露给其他模块。我怎样才能这样做呢? (2认同)