Xcode 6 / Beta 4:不支持在框架目标中使用桥接头


131

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

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

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

我意识到Beta 3消除了对实时视图框架的需求,但是对于我来说,如果我能使它正常工作就很有意义。我可以删除它作为后备,但是如果它们在Beta 4中没有被完全破坏,则希望使用一个框架。


“我意识到Beta 3消除了对框架的需求”。怎么样?
hnh 2014年

2
(实时取景)-编辑
克里斯·康诺夫

1
我遇到了同样的问题。
西蒙·杰曼

2
哇,您在那里的小修改使我的生活变得更加美好-没听说过任何地方的这种变化(消除了对框架的需求),并且让我为所有这些框架目标而动摇了数小时。非常感谢您这个@chrisco!
yonix 2014年

Answers:


232

由于错误状态,框架中不允许桥接头。在从在同一框架内目标导入代码中的部分混合&搭配在这个苹果文档的提示。正如他们所说,您需要“在伞状头文件中,导入要公开给Swift的每个Objective-C头文件”。

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

因此,请执行以下操作:

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

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


3
感谢您的答复简洁(标记为此类)。我已经读过该部分,但对伞和桥接头之间的区别感到困惑。
克里斯·康诺夫

1
@ zaxy78检查出的“导入到雨燕的Objective-C”这个文件的部分:developer.apple.com/library/ios/documentation/Swift/Conceptual/...
DeepFriedTwinkie

4
@DeepFriedTwinkie,当您说“将必要的标头添加到伞形文件”时,您指的是什么伞形文件?谢谢。
艾伦·马卡丁格

2
这正是我所需要的。解决方法是将它们添加到公共部分。
olivaresF

20
我是否正确地假设,那么我想在我的框架中保留为私有的所有类,而这些类必须由swift类使用,现在必须对使用我的框架的任何人公开?似乎不是理想的解决方案。
ospr

28

有两种可能性。将必要的标头添加到伞形标头文件并使其公开是一种方法。但是,如果标头应可用于Swift而不是公共的,则这是一个问题。

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

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

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

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

2
优秀的!谢谢。优先于公开所有标头的技术。
David H

强烈建议您针对其他解决方案,并查看提供的详细解决方案链接
Tancrede Chazallet

这是imo的正确答案,但根据您要实现的目标,您可能可以使用Apple提供的一些宏,这些宏对Swift-Objc互操作有很大帮助:developer.apple.com/documentation/swift/ …
乔·苏斯尼克

header语句接受相对路径。要添加另一个框架的标头时该怎么办?
Georgios

13

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

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

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


1
我想在模块Swift文件中使用objc文件,但是我不想将它们公开给其他模块。我该怎么办?
Sazzad Hissain Khan,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.