未找到将 Project-Swift.h 导入 Objective-C 类... 文件

我有一个项目是在 Objective-C 中启动的,我正在尝试将一些 Swift 代码导入到我之前在 Objective-C 中编写的相同的类文件中。

我咨询了苹果 医生在同一个项目中使用 Swift 和 Objective-C,以及像这样的 SO 有个问题,但仍然没有用: 我继续得到的文件没有发现错误后,放入 #import "NewTestApp-Swift.h"(NewTestApp是产品和模块的名称)。

以下是我迄今为止所做的工作:

  1. Define Modules中,为应用程序选择了 YES
  2. 确保 Product Module 名称中没有任何空格(见下面问题的截图)

我试过在 ViewController.mViewController.hAppDelegate.m中使用 #import "NewTestApp-Swift.h",但是没有一个有效。

我还做错了什么? 谢谢你的帮助。


设置截图:

enter image description here


我目前遇到的错误:

enter image description here

117836 次浏览

如果 Swift 代码位于模块中(如您所示) :

#import <ProductName/ProductModuleName-Swift.h>

如果 Swift 代码位于项目内部(Swift 和 ObjecC 混合) :

#import <ProductModuleName-Swift.h>

在您的示例中,您必须在 * . m 文件中添加以下代码行:

#import <NewTestApp/NewTestApp-Swift.h>

重点: 查看 import 语句中的“ <”

Https://developer.apple.com/library/content/documentation/swift/conceptual/buildingcocoaapps/mixandmatch.html

我遇到了同样的问题,无法让我的项目将 swift 导入 obj-c 类。使用 Xcode 6,(应该适用于 Xcode 6 +)并且能够以这种方式完成... ..。

  1. 任何需要访问 abc0的类都需要像这样的前向声明

@class MySwiftClass;

  1. 在。M 文件,如果代码是在同一个项目(模块) ,那么您需要导入它与

#import "ProductModuleName-Swift.h"

链接到有关它的苹果文档

Https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c

我是如何设法将“迅速”引入到目标 C 中的:

  • 定义模块 设置为 YES (在项目上-不在目标上)
  • 产品模块名称 set (on target-not on project)
  • 在 ViewController.m 中,使用以下命令导入快捷代码:

    #import "MyProductModuleName-Swift.h"
    
  • Add a swift file to your objective-c project (File -> New -> Swift) and Xcode will create the bridging header from objective-c to Swift but this is crucial for making it work the other way around too - apparently.

For the last piece in this puzzle thanks to Swiftoverload for making me aware of actually adding a Swift file via Xcode GUI and not just dragging and dropping existing swift-files into my project for making it work: http://nikolakirev.com/blog/using-swift-in-objective-c-project

我在把 Swift 导入 Objective-C 项目时遇到了问题。最后,我查看了 DeriviedData 文件夹以检查 Xcode 7正在生成什么。文件名与我期望的完全不同。

一旦我有了实际的文件名,我就可以导入它,然后项目就可以构建了。

在使用 git 开发项目时,我的团队也遇到过同样的问题。一个开发人员还没有将 Xcode 更新到最新版本(7.3) ,这是最新的 Swift 2.2版本所需要的。因此,编译器无法识别新的 Swift 语法,也无法为 Swift 库生成接口(projectname-Swift. h)。 检查 Xcode 版本是否是最新版本!

使用 Xcode 8.2.1,如果查看 工程项目 > Build Settings > Objective-C 生成的接口头名称,就会看到名为 产品-Swift 的 只有一个头文件。哦

这意味着不需要单独导入 Objective-C 中的每个模块。M 文件,使用单独的 -Swift.h 文件,只需导入一个 产品-Swift.h,它聚合了所有 Swift 模块。

我在寻找单独导入模块的传统方法时也遇到了同样的问题,但是当前版本的 Xcode 和 Swift 3改变了它,对于所有的模块导入只使用一个头。

定义模块: 是的 在 Obj-C 类的. m 文件中导入“ ProjectName-Swift.h”

这对我访问 Obj-c 中的 Swift 类很有用。

在开发过程中,可能会出现任何没有完全实现的快速类,由此可能会出现一些语法错误。 只有当所有的快速头文件都是无错误的时候,才可以使用快速头文件。

确保迅速文件中没有语法错误,然后尝试在 Objective-c 文件中导入快速标头

导入头文件,即。

#import "<ProjectName>-Swift.h"

在.h 文件中生成了一个错误,说明:

- 找不到 Swift.h’文件

但是构建失败了。

取而代之的是:

#import "<ProjectName>-Swift.h"

在. m 文件中,并且即使出现相同的错误,仍然运行该项目会抑制该错误。

然后,可以在.m 文件中使用 Swift 类。

我面临的问题与项目(目标)的名称。它包括符号“-”。所以接下来的决定是: 如果项目的名称是“ Test-App”,那么导入的类的名称是“ Test _ App-Swift.h”

花一个小时在这个问题上,下面的步骤将帮助你理解缺少什么:

  1. 打开 Xcode 首选项并导航到派生数据文件夹
  2. 在 finder 中搜索“ Swift. h”
  3. 如果您找不到任何 project-ift. h 文件,则尚未生成此文件。您通常需要将@objecc 添加到您的 Swift 类中,并成功构建应用程序,只有这样 Xcode 才会生成这个文件
  4. 如果您找到了“ xxx-ift. h”文件,请确保您的 import 语句包含正确的名称。

how-to-locate-swift-file

找不到 iOS-Swift.h 文件

[混合目标-C 和迅速]

如果 Swift 代码通过 @objc@objcMembers< sup > [ About ] 公开一个 API,那么应该由 Xcode 自动创建 <name>-Swift.h

通常情况下

~/Library/Developer/Xcode/DerivedData/
ProductModuleName-foo/
Build/
Intermediates.noindex/
ProductModuleName.build/
Debug-iphoneos/
ProductModuleName.build/
DerivedSources/
ProductModuleName-Swift.h

它可以被改变

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

默认情况下,该值为 $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

如果有多个目标,请确保已经构建了所有框架

如果您的应用程序名称有任何特殊字符,则使用 _ for 特殊字符。

例如,如果您的应用程序名称为“测试应用程序”

然后您可以通过“ Test _ App _-Swift.h”导入快捷文件。

空格,并在导入时被 _ 替换。

Xcode 11

我在构建 Xcode 11时遇到了这个问题。我花了一点时间才弄清楚哪里出了问题,但本质上,我已经改变了“显示名称”设置在目标的“一般”选项卡,而不是直接改变在 Info.plist文件通过“信息”选项卡在目标。

这导致 Xcode 11.5需要重写/创建一系列全新的定制构建设置,并修改应用模块和构建的名称。应用程序产品。在这种情况下,新的显示名称还有一个正斜杠(/)字符,这可能是它最终没有构建的原因(参见 @ Silversky Technology回答)。

无论如何,我解决这个问题的方法是撤销对项目文件的所有 Xcode 11.5的自动更改,并手动对 Info.plist文件中的 bundle 显示名进行相同的更改,所有这些工作都非常完美。

我希望它能告诉你,它正在做这样的事情之前,它刚刚起飞,这样做没有你的同意。

请确保您的雨燕类有公共声明,并扩展 NSObject:

public class MySwiftClass: NSObject {
//...
}

导入应该使用引号,而不是括号,如果迅速类是在同一个项目。

如果您首先添加一个快速文件,请记住将快速文件添加到您的目标... ,在左栏

我有同样的问题 # import“ myProj-Swift. h”没有找到,Xcode 12.3,年份是2021。

似乎除非已经生成了桥接头,否则不可能导入 myProj-Swift.h。

当需要将 Swift 添加到 Objective-C 项目时,我的(可重复的)解决方案是在我的项目中创建(File-New File-Swift File)一个虚拟的空 Swift 文件。然后 Xcode 询问是否创建桥接头,我的回答是肯定的。这会导致一个“ myProj-Bridge-Header”。“ h”文件添加到项目中,该文件在“项目导航器”中可见。

完成此操作后,# import“ myProj-Swift. h”上的错误将消失。

之后,我可以删除虚拟文件,并插入所需的 Swift 类到项目。

生成一个可见的桥接头,但是保持-Swift.h 完全不可见的逻辑完全逃避了我的问题。不要介意在官方文档 将 Swift 导入 Objective-C中试图找出这一点的挑战,它(对我来说是不准确的)声明“您不需要做任何特殊的事情来创建生成的头”。

这可能是一个好主意,也要注意从 @ Sandeep Bhandari到这个 有个问题的答案-他说-Swift.h 文件只有在项目成功编译的情况下才会生成。

更多信息也在 这个这个的问题。

目标可执行文件缺少对我的(或任何其他事实上的)框架的依赖。

构建阶段-> 依赖项必须列出目标的依赖项,以避免间歇性错误: 在我的例子中是调试 构建很好,自动化的 Jenkins CI 构建失败了。 考虑到 Jenkins 的输出产品,调试是一个噩梦 大量的垃圾,这是一个巨大的时间坑通过。

我在复制了一个现有目标后遇到了这个问题。当我尝试使用重复的目标进行构建时,出现“ ProductName-找不到 Swift.h 文件”错误。

在浏览了新目标中的构建设置之后,我发现设置“ 产品名称”的值设置为与目标名称相同。使用正确的设置后,错误消失了。

如果您的产品名是 TestApp-Dev,那么文件名将是 TestApp _ Dev-Swift. h

您可以通过访问以下位置进行验证 图书馆/开发者/Xcode/衍生数据//Build/Intermediates.noindex/yourProjectbuild/Debug-iphone 模拟器/MashreqMobileApp.Build/衍生数据源

如果希望每个生成方案的文件名相同,请转到 在模块/方案中构建相同的设置(设置为 $(PROJECT _ NAME)-Swift.h)。

如果项目名称是 TestApp,那么生成的文件将是 TestApp-Swift.h,并且在整个方案中保持不变