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


128

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

我已在同一项目中就使用Swift和Objective-C 咨询过Apple 文档,以及诸如此类的问题,但仍然无济于事:放入后,我继续收到未找到文件的错误#import "NewTestApp-Swift.h"NewTestApp是产品名称和模块)。

到目前为止,这是我所做的:

  1. 在中Define ModulesYES为应用程序选择。
  2. 确保产品模块名称中没有空格(请参见下面的屏幕截图)

我已经尝试使用#import "NewTestApp-Swift.h"ViewController.mViewController.hAppDelegate.m但他们没有工作过。

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


设置屏幕截图:

在此处输入图片说明


我目前遇到的错误:

在此处输入图片说明


3
删除所有“派生数据~/Library/Developer/Xcode/DerivedData”对我有用。
wzhang84 '16

这是我解决问题的方法:stackoverflow.com/a/45338549/8102549
schrulnz

Answers:


158

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

  1. 您需要在.h文件中访问的任何类都必须是这样的前向声明

@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


3
感谢你的回答。那把我引向正确的方向。我有同样的问题,但是有一个协议,所以我不得不在我的头文件中添加@protocol MySwiftProtocol而不是导入。
Palme

在.h文件中对类进行前向声明而不增加.h文件对我来说是成功的窍门。谢谢
Sikander '18

1
请注意,如果您的产品名称中包含-字符,则生成的头文件的名称会将其转换为_。例如,如果您的产品名称是My-App,则将导入My_App-Swift.h
dvanoni

1
我找到了一种新方法来查找正确的生成的头文件名:转到目标->构建设置->搜索关键字Objective-C Generated Interface Header Name,宾果游戏!
Itachi

2
我已经完成了这两项工作,并且仍然遇到相同的问题。您认为与订单有关吗?
ArielSD

83

如果Swift代码在Module内部(例如您的情况):

#import <ProductName/ProductModuleName-Swift.h>

如果Swift代码在项目内部(Swift和ObjC混合):

#import <ProductModuleName-Swift.h>

对于您的情况,您必须在* .m文件中添加以下行:

#import <NewTestApp/NewTestApp-Swift.h>

重要说明:查看导入语句中的“ <”

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html


感谢您回答@ ikocel1。不幸的是,这些没有用。我试过的变化<NewTestApp-Swift/NewTestApp-Swift.h><NewTestApp/NewTestApp-Swift.h>以及<NewTestApp/ViewController-Swift.h>里面所有ViewController.m,但继续得到错误“找不到文件”,尽管Cleaning尝试了组合之后每次项目。如果问题有帮助,我会在问题正文中添加一个屏幕截图。
daspianist 2014年

我尚未在中输入任何Swift代码ViewController.m。我一直只是尝试先导入标头,以尝试使其接受Swift代码。我将在中混合和匹配Objective-C和Swift代码ViewController.m
daspianist,2014年

1
我不知道是否可以在同一文件中直接混合objc代码和swift代码。
ikocel1 2014年

1
谢谢,我想这是我基于Apple的“ Mix and Match”文档得出的假设。但是我想不在实际文件中。谢谢!
daspianist,2014年

6
我不知道为什么这个答案被批准。是的,遵循文档是正确的,但实际上对我也不起作用。即使在问题中,很明显,用户也会使用此答案所建议的语法,但仍然会出错。
Darius Miliauskas,2015年

54

我如何将swift导入Objective-C:

  • 将模块设置为“是”(在项目上-不在目标上)
  • 产品模块名称集(按目标-不在项目上)
  • 在您的ViewController.m中,使用以下命令导入swift代码:

    #import "MyProductModuleName-Swift.h"
  • 向您的Objective-C项目添加一个Swift文件(文件->新建-> Swift),Xcode将创建从Objective-C到Swift 的桥接头但这对于使其以相反的方式工作至关重要 -显然。

对于这个难题的最后一部分,感谢Swiftoverload使我意识到实际上是通过Xcode GUI添加一个Swift文件,而不仅仅是将现有的swift文件拖放到我的项目中以使其工作:http : //nikolakirev.com/blog /在目标C项目中使用Swift


优秀的笔记。我要添加的是,测试目标是其自己的模块,并将具有其自己的标题为“ <#TestTargetName#>-Swift.h”的标头,并且目标名称中的任何空格都将转换为空格。
Chuck Krutsinger

@ holm51不好意思问这个,但如果是Define ModuleProduct Module Name
matchifang

破折号-的名字将被转换为下划线_以及
Cyber​​Mew

11

使用Xcode 8.2.1,如果您查看“ 项目” >“构建设置”>“ Objective-C生成的接口头名称”,则那里显示一个名为Product -Swift.h的头文件。

这意味着您不必使用单独的-Swift.h文件从Objective-C .m文件中单独导入每个模块,而只需导入一个汇总了所有Swift模块的Product -Swift.h。

我在寻找分别导入模块的传统方式时遇到了相同的问题,但是当前版本的Xcode和Swift 3将其更改为在所有模块导入中仅使用一个标头。


嗨,彼得,在哪里可以找到此文件?还是由xcode自动生成?另外,由于此更改,您是否必须以其他方式设置Podfile?
罗伯·诺巴克

@RobNorback如果我没有记错的话,您只需在Obj-C标头/实现文件中写入“ import”“ Product-Swift.h”即可查看效果,而无需执行其他任何操作。确保您的项目设置为Swift和Obj-C混合启用了所有配置。另外,我仍然没有遇到Podfile的问题。如果我看到的情况有所不同,请告诉我。
petershine

谢谢,我花了几个小时尝试调试它,确实的问题是项目中的每个模块都在生成自己的-Swift.h头文件。强迫它们(我有5个目标)使用通用头文件为我解决了这个问题。
Apoorv Khatreja '10

@ApoorvKhatreja您是如何强迫他们这样做的?明确写入文件名?
阿米特·拉兹

8

在此问题上花了一个小时,按照以下步骤操作将有助于您了解缺少的内容:

  1. 打开Xcode首选项并导航到DerivedData文件夹
  2. 在查找器中搜索“ swift.h”
  3. 如果找不到任何project-swift.h文件,则表明该文件尚未生成。通常,您需要将@objc添加到您的swift类之一并成功构建应用程序,然后Xcode才会生成此文件
  4. 如果找到“ xxx-swift.h”文件,请确保您的导入语句包含正确的名称。

如何找到快速文件


请不要对多个问题添加相同的答案。一旦赢得足够的声誉,就回答最好的一个,并将其余的标记为重复。如果不是重复的内容,则根据问题定制帖子,并标记为不删除。
巴尔加夫(Bhargav Rao)

这次真是万分感谢!我更改了应用程序的diplay名称(而不是目标名称),而Swift标头也更改了名称。这是我可以找到正在发生的事情的唯一方法。
Lucas P.

感谢您发布答案。屏幕截图和精确的点位形式立即使我向后滚动+看上去+结束了我的搜索...问题已解决!
dklt

6

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

一旦有了实际的文件名,我就导入了该文件,并且可以构建项目。


2
该文件在哪里?我环顾四周,找不到任何东西
阿米特·拉兹

5

-Swift.h如果Swift代码通过@objc[关于]公开API,则应该由Xcode自动创建@objcMembers

通常一个位置看起来像

~/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)


2

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

这对我来说可以访问Obj-c中的Swift类。


3
但是,如果我需要objc标头中的swift类,如何将其导入.h文件?
亚历山大·丹尼洛夫

1

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


我遇到的问题是因为我决定推迟迁移到Xcode提供的Swift 3。结果,Xcode无法构建Swift源文件,也无法生成要包含的标头。
iutinvg '16

1

在开发过程中,您可能会遇到尚未完全实现的任何swift类,这可能会导致某些语法错误。只有所有swift文件均无错误时,swift头文件才可用。

确保swift文件中没有语法错误,然后尝试在目标-c文件中导入swift标头


1

导入头文件,即

#import "<ProjectName>-Swift.h" 

.h文件中的错误产生了一个错误,指出:

找不到-Swift.h'文件

并且构建失败。

而是使用:

#import "<ProjectName>-Swift.h"

在.m文件中,即使出现相同的错误,无论如何运行项目都会抑制该错误。

然后,.m文件中提供了swift类。


1

我遇到了项目名称(目标)的问题。它包括符号“-”。因此,下一个决定是:如果项目名称为“ Test-App”,则导入的类的名称为“ Test_App-Swift.h”


一流的解决方案
iOS Lifee

1

如果您的应用名称中包含任何特殊字符,请使用_表示特殊字符。

例如,如果您的应用程序名称为“ TestApp®”

然后,您可以通过“ Test_App_-Swift.h”导入swift文件。

导入时,空格和®用_代替。



0

Xcode 11

在Xcode 11上构建时,我遇到了这个问题。我花了点时间找出问题所在,但从本质上讲,我已经更改了目标“常规”选项卡上的“显示名称”设置,而不是Info.plist通过目标上的“信息”标签。

这导致Xcode 11.5进行重写/创建了一堆全新的自定义构建设置,并修改了app模块和所构建的.app产品的名称。在这种情况下,新的显示名称中还带有一个正斜杠(/)字符,这可能最终就是为什么它没有构建的原因(请参阅@Silversky Technology答案)。

无论如何,我通过撤消Xcode 11.5对项目文件的所有自动更改并手动对文件中的包显示名称进行相同的更改来解决此问题,Info.plist并且一切正常。

我希望它会告诉您,它在开始之前就正在做这样的事情,并且未经您的同意就做。


0

确保您的swift类具有公共声明,并扩展了NSObject:

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

如果swift类在同一项目中,则导入应使用引号而不是括号。

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.