Swift to Objective-C头文件不是在Xcode 6中创build的

我最近一直在努力将Swiftjoin到现有的项目中,以现实世界的方式进行尝试。

在将Swift源文件添加到项目中后,我无法获得“Bridging Header”,即Objective-C到Swift。

但是-Swift.h头文件是应该公开Swift类的,标记为@objc或ObjC类的子类, 无处可寻:-(

我没有看到关于如何在我的主应用程序代码(仍然是Obj-C)中完成使用Swift编写的新子类的具体说明。

我是开发人员的应用程序有一个相当大的代码库(70.000行),所以一次过渡它是不可能的。

现在起作用了。

  1. 项目必须具有包含空格的产品模块名称。
  2. 定义模块必须在“生成设置”的“打包”下设置为“ ”。

最后工作。 感谢大家的帮助:-)

我有类似的问题,发现你只能添加

#import “ProductModuleName-Swift.h”

到obj-c .m文件,而不是.h文件的伞标题被发现

我发现我必须在生成文件之前修复所有生成错误。

对于我来说问题是,这是一个鸡/鸡蛋的问题,因为我没有看到任何生成错误,直到我实际上注释了#import语句:

//#import "ProductModuleName-Swift.h"

在我的Swift代码中显示了一堆其他的错误。

一旦我解决了这些新的错误,并成功地获得了源代码,我取消了#import和宾果的注释! 标题被创build并正确导入:)

如果您的项目模块名称中有空格,则必须用下划线replace空格。

例如,如果你的项目名称是“我的项目”,你可以使用:

#import“My_Project-Swift.h”

如果你像我一样,你可能会得到错误的标题名称。 打了一会儿之后,我在DerivedData中查找了这个文件,果然就在那里。 在我的设置(使用标准派生的数据文件夹,我相信):

 cd ~/Library/Developer/Xcode/DerivedData find * -iname '*Swift.h' 

会find它。 如果该文件夹中没有任何内容匹配,则Xcode不生成它。

我正在使用Xcode版本6.2(6C86e)

*唯一重要的是:*

在目标中使用已定义的“产品模块名称”,然后是-Swift.h

 #import <Product Module Name>-Swift.h // in each ObjectiveC .m file having to use swift classes // no matter in which swift files these classes sit. 

无论“定义模块”参数是否设置为“是”或“否”,或者“产品模块名称”项目未设置。

提醒:Swift类必须从NSObject派生,或者被标记为@objc属性才能暴露给ObjectiveC / Foundation || cocoa …

我想添加一个更多的理由,你可能会发现这个问题 – 我正在创build一个混合了Swift和Objective-C代码的框架。 我无法在框架之外导入Swift类 – 我检查了-Swift.h文件,它正在生成但是是空的。

问题变得非常非常简单 – 我没有公开任何我公开的Swift类。 只要我把public关键字添加到类中,我就可以在框架内部和外部的类中使用它们。

另外值得注意的是,在框架内部(在.m文件中,只有另一个答案提到)我不得不将-Swift.h文件导入为:

 #import <FrameworkName/FrameworkName-Swift.h> 

我有同样的问题。 似乎你必须调整设置(定义模块和产品模块名称), 然后再添加第一个Swift文件。

如果你以后做了这个项目,就不会为这个项目生成“* -Swift.h”文件,即使你添加了更多的Swift文件或删除了Swift文件并创build了一个新文件。

文件名称始终以您的目标名称开头。 它被称为产品名称,但实际上它是目标名称。 所以,如果你想要它为一个新的目标build立准备期待that_target-Swift.h文件。

处理这个问题的一个方法是

  1. 为每个目标添加一个预处理器,它是目标本身的名称(不含空格)。 防爆。 MY_TARGET=1 。 将其添加到项目设置 – >生成设置 – >预处理器macros为您的每个目标。
  2. 如果您正在使用PCH文件,

在PCH文件中添加这些行

 #if MY_TARGET==1 #include "My_Target-Swift.h" #elif THAT_TARGET==1 #include "That_Target-Swift.h" #endif 

使用PCH文件的好处是你不必在任何地方包含头文件。

  1. 如果您不使用PCH文件,只需将这些相同的行添加到单个标头中,并在需要使用swift类的地方包含该标头。

这应该工作得很好。

这里是moduleName-Swift.h的另一个变种没有被生成。

我决定在我的项目中包含IOS图表 ,但不想在同一目录中混合源代码,所以我将Charts Project文件夹放在代码的项目文件夹旁边。 我将Charts项目拖放到项目的导航栏中,并将框架包含在常规项目设置的项目目标的embedded式二进制文件列表中,并在Build Options部分的项目Build Settings选项卡中将embedded式内容包含Swift Code切换为yes。

我的项目的moduleName-Swift.h文件永远不会生成,无论其他开关或设置在这里build议。 最后,使用Lou Zfind-Swift.h文件的方法,我看到在我的项目的xcode Build目录下的Charts.framework / Headers /

使用Daniel Gindi的ios-charts Swift软件包而不在我的项目源代码目录中包含代码的解决scheme是添加:

 #import "Charts/Charts-Swift.h" 

到模块图表我的项目的数据。

如果XCode实际上正在生成-Swift.h头文件(深入到DerivedData中),但它并不引用Swift类,请确保您还有一个定义的桥接头文件。 我读文档的方式暗示我只需要从Swift调用Objective-C,但是从Objective-C调用Swift似乎也是必须的。

请参阅我的回答: https : //stackoverflow.com/a/27972946/337392

编辑:这是因为公共与内部访问修饰符,因为我最终发现解释在苹果文档: –

默认情况下,生成的头文件包含用public修饰符标记的Swift声明的接口。 如果您的应用程序目标具有Objective-C桥接标头,则它还包含那些标有内部修饰符的标记。

请允许我分享我尝试在旧的objc项目中使用Swift的经验。 我不必将Defines module设置为YES

在我的情况下,我需要手动确保有一个objc桥接头。 只有生成的接口标题名称出现在我的构build设置中。

缺少桥接头

这导致生成一个MyApp-Swift.h文件,但没有任何我的Swift类的痕迹。

Apple文档说,添加第一个swift文件时,系统会提示您创build一个桥接标头。 那么,我不是。 我手动添加了一个MyApp-Bridging-header.h文件,并在“Objective-C Bridging Header”字段中指向它。 这使我的MyApp-Swift.h文件成为我的Swift类填充。

Docs: 将Swift导入Objective-C

借调许多人在这里,但添加相关的屏幕截图。 Swift和Obj-C代码当然可以一起生活。 这不是一个全部或没有游戏。

要访问Objective-C中的Swift文件,只需将此调用添加到Obj-C文件(在.m / implementation文件中):

 #import "{product_module_name}-Swift.h" 

(其中{product_module_name}表示项目的产品模块名称)。 不要尝试猜测你的产品模块名称,或者找出空格和特殊字符的angular落案例,只需在项目的构build设置选项卡中input“产品模块名称” – 检查员将向你展示你的产品。 这是我没想到的事情。 看看这个屏幕截图,如果你感到困惑。

在这里输入图像描述

而要获得在Swift中工作的Obj-c代码,只需要添加一个桥接头文件,并在那里导入相关的Obj-C头文件。

最重要的是这个文件是隐形的! 至less它在Xcode6 beta5中。 在你的工作区中不会有这样的文件名为“YourModule-Swift.h”。 只要确保你有模块名称,并将模块设置为yes,并在Objective-C类中使用它。

这个答案解决了你可能已经有一些调用Swift类的Objective-C代码的用例,然后你开始接收这个错误。

如何解决问题

以下步骤最终解决了我所有的问题。 我读过上面有人提到的“鸡与鸡蛋”,正是这个概念导致我这个程序。 这个显式的过程表明,必须删除任何引用Swift类的Objective-C代码,直到生成头之后。

  1. 注释掉Objective-C实现文件中的#import“ProductModuleName-Swift.h”语句
  2. 将Objective-C实现文件中的所有引用注释到Swift类中
  3. 清洁和build设
  4. 解决所有错误/警告
  5. 删除#import“ProductModuleName-Swift.h”语句中的注释
  6. 清理和构build(成功或修复任何剩余的错误, 确认你没有在Objective-C中引用任何Swift类,如果这样的话暂时注释掉)
  7. validation“ProductModuleName-Swift.h”是否由Cmd生成– 单击 #import“ProductModuleName-Swift.h”语句的类名
  8. 删除Objective-C实现文件中引用Swift类的代码的注释。
  9. 正常清洁和构build(应该生成“ProductModuleName-Swift.h”,并且您的Objective-C代码引用Swift类可以像平常一样使用)

Nota Bene:在执行这个过程时,上面给出的有关更改空格以强调下划线和定义模块为YES的答案仍然适用, Apple文档中指定的规则也是如此。

桥接标题path

在一个错误中,在构build过程中没有find文件ProductModuleName-Bridging-Header.h。 这个事实产生了一个错误

<unknown>:0:错误:桥接头'/Users/Shared/Working/abc/abc-Bridging-Header.h'不存在

仔细检查错误表明文件将不会存在于描述的位置,因为它实际上位于( 错误的path

'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h'。 快速search目标/项目的构build设置以手动进行校正,然后再次自动生成abc-Swift.h文件。

建立的设置

您必须在Objective-C类中导入一个头文件,这是:

 #import “ProductModuleName-Swift.h” 

它是自动生成的,在引用上说:“目标中的任何Swift文件将在包含此导入语句的Objective-C .m文件中可见。

项目中的实际文件不会被创build ([ProductModuleName] -Swift.h)。 Cmd +点击导入可以在运行(和内存)中生成它,这样你就可以看到连接是如何完成的,或者在某个Xcodecaching目录中的某处打开文件,但是它不在项目目录中。

您需要将“ 定义模块”项目prop(在目标的“生成设置”中)设置为“ 是”,并且如果模块名称中包含空格或破折号,请在[ProductModuleName] -Swift.h文件的所有导入中使用_。

您可以在所有使用swifttypes的.h和.m文件中导入它,也可以在.pch中导入它。

所以如果我的模块(项目)被命名为“testing项目”,我会像这样在我的项目的.pch文件(就在那里)导入:

 #import "Test_Project-Swift.h" 

只是为所有使用“。”的人提供了指导。 在那里项目名称。 Xcode将取代“。” 对于桥接头文件的Swift版本使用下划线“_”。 奇怪的是,生成的Bridging-Header.h不会用下划线代替句点。

例如名为My.Project的项目将具有以下桥接头文件名称。

Bridging-Header.h(自动生成)

My.Project桥接,Header.h

Swift.h

My_Project.h

我希望这能帮助那些使用了一段时间,并像我一样卡住的人。 该文件可以在以下位置find。

Macintosh HD / Users / user /Library/Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/DerivedSources

保重,

乔恩

项目必须具有不包含空格的模块名称。 定义模块必须在“生成设置”的“打包”下设置为“是”。 注释了#import声明:

如果仍然在导入“ProductModuleName-Swift.h”时出错

//#import“ProductModuleName-Swift.h”

在我的Swift代码中显示了一堆其他的错误。

一旦我解决了这些新的错误,并成功地获得了源代码,我取消了#import和宾果的注释! 标题被创build并正确导入:)

好吧,这里是你真正需要的所有东西!

1.删​​除所有已添加的swift文件,并编译代码,没有任何错误。

———-

在这里输入图像描述

———-

2.转到“项目”编译设置,并设置产品模块名称。 项目必须具有不包含空格的产品模块名称。

———-

在这里输入图像描述

———-

3.定义模块必须在生成设置中,在项目的包装下设置为是,而不是目标!

———-

在这里输入图像描述

———-

4.现在创build一个swift文件或视图控制器,在file-> newFile->中

———-

在这里输入图像描述

———-

它会要求创build一个桥接头,让它做一个。 如果你拒绝了一次,你将不得不手动添加一个-Bridging-Header.h

5.在控制器中添加@objc,告诉编译器有一些swift文件需要暴露给ObjectiveC

———-

在这里输入图像描述

———-

6.build立项目并在任何一个objectiveC控制器中导入#import“-Swift.h”,它将起作用! 你可以通过命令点击它来查看实际的文件!

———-

在这里输入图像描述

———-

希望这可以帮助!

我发现了一个总是对我有用的技巧。

  1. 在appDelegate.h文件和ProductName-Prefix.pch文件中创build#import“ProductModuleName-Swift.h”。 如果你没有它在xcode 6中,你可以用这种方式创build它为什么不是在Xcode 6中自动创buildProjectName-Prefix.pch?
  2. Command + shift + k清理你的代码,如果你收到一个关于你的“ProductModuleName-Swift.h”的错误,将它从appDelegate.h文件中删除。
  3. 再次清理你的代码。 现在一切都会像魅力一样工作
  4. 如果再次收到有关“ProductModuleName-Swift.h”的错误,现在再次在appDelegate.h文件中创build并再次清理代码。

做这个工作(从appDelegate.h文件中删除并创build“ProductModuleName-Swift.h”,并清理你的代码),每次你收到这个错误来保持沉默。

我find了这个解决scheme

  • 创buildSwiftBridge.h
  • 把#import“ProductModuleName-Swift.h”
  • 使这个.h文件公开(重要)select文件 – >在显示文件检查器(右栏) – >公开

现在你可以

 #import "SwiftBridge.h" 

而不是ProductModuleName-Swift.h

这是一个解决方法,下一个版本的Xcode我认为这个问题将得到解决。 祝你好运

我很难确定我的模块名称/目标C的导入的swift的标题。 我也在这里读了很多文章。

但是对于所有包含特殊字符(即“。”或数字或空格)的项目名称的确定答案,您可以在目标的“生成设置”下的“ 产品模块名称 ”中find适用于您的文本。

例如,我的目标名称以数字开头 – “1mg”,上面提到的字段显示“_mg”作为我的模块名称。

所以我用#import“_mg-Swift.h”,它的工作。

目标的构建设置中的产品模块名称给出了适用于您的项目的正确的模块名称

在我的情况下,我不得不将部署目标至less设置为“OS X 10.9”,并自动生成-Swift.h头文件。 请记住,当您更改部署目标版本时,可能会收到大量的弃用警告,特别是当您有一个较旧且非常大的Objective C代码库时。 在我们的例子中,我们在XIB文件和视图类中也做了很多工作。

如果你之前能够构build一个项目, “ProductModuleName-Swift.h” not found“ProductModuleName-Swift.h” not found相关的错误,而现在你又得到了那些令人讨厌的错误,那么原因可能就在于你最近的改变。

对我来说,这是(意外的)错误.swift文件编码。 恢复更改并手动返回,完成这项工作。

这可能是一个明显的观点(也许太明显了),但是项目中至less要有一个swift文件来生成头文件。 如果您正在编写样板文件或configuration代码,以便稍后快速写入,导入将不起作用。

我不得不从我的Objective C项目中删除WatchOS2 swift代码。 只有在XCode提供生成-Swift.h之后

我有类似的问题,但我的项目编译之前,几乎没有文件代码更改突然出现错误。 我花了一段时间来找出为什么我得到“文件未find”错误myproject-swift.h文件。 我所做的代码更改有一些错误。 Xcode没有指出把这些错误,而是所有的时间显示“文件未find错误”。 然后得到以前的版本代码的副本,我比较新的代码和合并文件逐一。 每个文件合并后编译项目来find错误。 所以底线是,如果你的代码中有错误Xcode可能只是显示myproject-swift.h文件'文件未find错误'。 您的项目中很可能有编译错误。 清理这些错误,它会工作。

如果您使用的是Cocoapods之类的东西(并且在工作空间而不是项目之外),请尝试在打开工作空间和构build之前打开该项目并构build它。 因人而异。

有时您只需要取消设置,然后再次在obj-c .m文件中设置目标成员资格。