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

时间:2014-10-12 17:37:47

标签: ios objective-c xcode swift xcode6

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

我在同一个项目中使用Swift和Objective-C咨询了Apple docs,以及这样的SO question,但仍无济于事:我继续找不到找到的文件放入#import "NewTestApp-Swift.h"后出错(NewTestApp是产品和模块的名称)。

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

  1. Define Modules中,为应用选择了YES
  2. 确保产品模块名称中没有任何空格(请参阅下面的问题截图)
  3. 我尝试在#import "NewTestApp-Swift.h"ViewController.mViewController.h中使用AppDelegate.m,但没有一个有效。

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


    设置屏幕截图:

    enter image description here


    我目前遇到的错误:

    enter image description here

18 个答案:

答案 0 :(得分:125)

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

  1. 您需要访问.h文件中的 所需的任何类都需要是这样的前向声明
  2. @class MySwiftClass;

    1. 仅在.m文件中,如果代码在同一个项目(模块)中,则需要使用
    2. 导入它

      #import "ProductModuleName-Swift.h"

      链接到关于它的苹果文档

      https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_87

答案 1 :(得分:74)

如果Swift代码在模块中(就像你的情况一样):

#import <ProductName/ProductModuleName-Swift.h>

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

#import <ProductModuleName-Swift.h>

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

#import <NewTestApp/NewTestApp-Swift.h>

重要提示:查看“&lt;”在导入声明中

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

答案 2 :(得分:47)

我如何设法将swift导入objective-c:

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

    #import "MyProductModuleName-Swift.h"
    
  • 将swift文件添加到您的objective-c项目(File - &gt; New - &gt; Swift), Xcode将创建从objective-c到Swift 的桥接头,但这是至关重要的让它以相反的方式发挥作用 - 显然。

感谢Swiftoverload让我意识到实际通过Xcode GUI添加Swift文件而不仅仅是将现有的swift文件拖放到我的项目中以使其工作: http://nikolakirev.com/blog/using-swift-in-objective-c-project

答案 3 :(得分:10)

使用Xcode 8.2.1,如果你看 Project &gt;构建设置&gt; Objective-C生成的界面标题名称,它显示只有一个头文件,名为 Product -Swift.h

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

我通过寻找单独导入模块的传统方式遇到了同样的问题,但当前版本的Xcode和Swift 3将其更改为仅使用一个标头进行所有模块导入。

答案 4 :(得分:6)

我在将Swift导入Objective-C项目时遇到了问题。最后,我查看了Derivied Data文件夹,检查Xcode 7生成的内容。文件名与我期待的完全不同。

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

答案 5 :(得分:2)

DEFINE MODULES:是的 并导入&#34; ProjectName-Swift.h&#34;在Obj-C类的.m文件中

这对我来说是在Obj-c中访问Swift类。

答案 6 :(得分:2)

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

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

how-to-locate-swift-file

答案 7 :(得分:1)

我遇到了同样的问题,#import "myProj-Swift.h" not found,Xcode 12.3,年份是 2021。

看来除非生成了桥接头,否则无法导入 myProj-Swift.h。

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

一旦完成,#import "myProj-Swift.h" 上的错误就会消失。

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

生成一个可见的桥接头,但让 -Swift.h 完全不可见的逻辑完全让我无法理解。不要介意在官方文档 Importing Swift into Objective-C 中试图找出这一点的挑战,它(对我来说不准确)指出“您不需要做任何特殊的事情来创建生成的标题”。

同时注意 @Sandeep Bhandari 对这个 question 的回答可能是个好主意 - 谁说 -Swift.h 文件只有在项目编译成功时才会生成.

更多信息也在 thisthis 问题中。

答案 8 :(得分:1)

如果您首先添加Swift文件,请记住在左侧栏中将swift文件添加到目标...

答案 9 :(得分:1)

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

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

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

答案 10 :(得分:1)

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

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

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

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

答案 11 :(得分:1)

如果Swift代码通过-Swift.h@objc [About]

公开

@objcMembers由Xcode自动创建

通常位置看起来像

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

答案 12 :(得分:1)

导入头文件,即

#import "<ProjectName>-Swift.h" 
.p文件中的

生成错误,指出:

  找不到

-Swift.h'文件

并且构建失败。

代替使用:

#import "<ProjectName>-Swift.h"

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

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

答案 13 :(得分:1)

在开发过程中,您可能会有任何未完全实现的swift类,因为可能存在一些语法错误。 只有当所有swift文件都没有错误时,swift头文件才可用。

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

答案 14 :(得分:1)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

Xcode 11

在Xcode 11上构建时遇到了这个问题。我花了点时间找出问题所在,但从本质上讲,我已经更改了Target的“ General”选项卡上的“ Display Name”设置,而不是直接在通过目标上“信息”标签的allprojects { repositories { google() jcenter() maven { url 'https://jitpack.io' } }} 文件。

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

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

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