我有一个在Objective-C中启动的项目,我试图将一些Swift代码导入到我之前编写的Objective-C相同的类文件中。
我在同一个项目中使用Swift和Objective-C咨询了Apple docs,以及这样的SO question,但仍无济于事:我继续找不到找到的文件放入#import "NewTestApp-Swift.h"
后出错(NewTestApp
是产品和模块的名称)。
这是我到目前为止所做的:
Define Modules
中,为应用选择了YES
。我尝试在#import "NewTestApp-Swift.h"
,ViewController.m
和ViewController.h
中使用AppDelegate.m
,但没有一个有效。
我还做错了什么?谢谢你的帮助。
设置屏幕截图:
我目前遇到的错误:
答案 0 :(得分:125)
我遇到了同样的问题,无法让我的项目将swift导入到obj-c类中。使用Xcode 6,(应该适用于Xcode 6+)并且能够以这种方式完成....
@class MySwiftClass;
#import "ProductModuleName-Swift.h"
链接到关于它的苹果文档
答案 1 :(得分:74)
如果Swift代码在模块中(就像你的情况一样):
#import <ProductName/ProductModuleName-Swift.h>
如果Swift代码在项目中(混合Swift和ObjC):
#import <ProductModuleName-Swift.h>
在您的情况下,您必须在* .m文件中添加此行:
#import <NewTestApp/NewTestApp-Swift.h>
重要提示:查看“&lt;”在导入声明中
答案 2 :(得分:47)
我如何设法将swift导入objective-c:
在ViewController.m中,使用以下命令导入swift代码:
#import "MyProductModuleName-Swift.h"
感谢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)
在此问题上花费了一个小时,请按照以下步骤操作,以帮助您了解缺少的内容:
答案 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 文件只有在项目编译成功时才会生成.
答案 8 :(得分:1)
如果您首先添加Swift文件,请记住在左侧栏中将swift文件添加到目标...
答案 9 :(得分:1)
确保您的swift类具有公共声明,并扩展了NSObject:
public class MySwiftClass: NSObject {
//...
}
如果swift类位于同一项目中,则导入应使用引号而不是括号。
答案 10 :(得分:1)
如果您的应用名称中包含任何特殊字符,请使用_表示特殊字符。
例如,如果您的应用程序名称为名称“ TestApp®”
然后,您可以通过“ Test_App_-Swift.h”导入swift文件。
在导入时,空格和®被_替换。
答案 11 :(得分:1)
-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上构建时遇到了这个问题。我花了点时间找出问题所在,但从本质上讲,我已经更改了Target的“ General”选项卡上的“ Display Name”设置,而不是直接在通过目标上“信息”标签的allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}}
文件。
这导致Xcode 11.5进行重写/创建了一堆全新的自定义构建设置,并修改了app模块和所构建的.app产品的名称。在这种情况下,新的显示名称中还带有斜杠(Info.plist
)字符,这可能最终就是为什么它没有构建的原因(请参见@Silversky Technology的answer)。>
无论如何,我通过撤消Xcode 11.5对项目文件的所有自动更改并手动对/
文件中的包显示名称进行了更改来解决此问题,一切正常。
我希望它会告诉您它在开始之前就正在做这样的事情,并且未经您的同意而这样做。