我尝试在我的app中集成 Swift
代码 . 我的应用程序是用 Objective-C
编写的,我添加了一个 Swift
类 . 我做了所有描述的here . 但我的问题是 Xcode
没有创建 -Swift.h
文件,只有桥接头 . 所以我创建了它,但它反过来了 . 反之亦然 . 我用 @objc
标记了我的快速课程,但它没有帮助 . 我现在能做什么?
编辑:Apple说:“当您将Swift代码导入Objective-C时,您依靠 Xcode-generated
头文件将这些文件公开给Objective-C . [...]此 Headers 的名称是您的产品模块名称,然后添加“-Swift.h” . “
现在,当我想导入该文件时,它会出错:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
这是我的FBManager.swift文件:
@objc class FBManager: NSObject {
var descr = "FBManager class"
init() {
super.init()
}
func desc(){
println(descr)
}
func getSharedGameState() -> GameState{
return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
}
}
21 回答
我有同样的问题,结果发现模块名称中的特殊符号被xcode取代(在我的情况下,破折号最后是下划线) . 在项目设置中,选中"module name"以查找项目的模块名称 . 之后使用
ModuleName-Swift.h
或在设置中重命名模块 .Details: Objective-C项目,在Xcode 8.1中使用Swift 3代码
Tasks:
在objective-c类中使用swift枚举
在swift类中使用objective-c enum
完整样本
1.使用Swift枚举的Objective-C类
检测Objective-C代码中的Swift代码
在我的示例中,我使用SwiftCode.h来检测Objective-C中的Swift代码 . 此文件自动生成(我没有在项目中创建此头文件的物理副本),并且您只能设置此文件的名称:
2.使用Objective-C枚举的Swift类
在Swift代码中检测Objective-C代码
您需要创建桥接头文件 . 当你在Objective-C项目中添加Swift文件,或者在swift项目中添加Objective-C文件时,Xcode会建议你创建桥接头 .
You can change bridging header file name here:
用法
结果
更多样品
3.从Objective-c代码调用Swift类
Result
4.调用Objective-c类来自SWIFT代码
Result
5.在Objective-c代码中使用Swift扩展
6.在swift代码中使用Objective-c扩展
该文件是自动创建的(这里谈论Xcode 6.3.2) . 但是你在Derived Data文件夹中赢了't see it, since it' . 使用
@objc
标记swift类后,编译,然后在Derived Data文件夹中搜索Swift.h
. 你应该在那里找到Swift Headers .我有问题,Xcode重命名我的
my-Project-Swift.h
到my_Project-Swift.h
Xcode不喜欢"." "-"
等符号 . 使用上面的方法,您可以找到文件名并将其导入Objective-C类 .只需在.m或.h文件中包含#import“myProject-Swift.h”即可
P.S你不会在文件检查器中找到“myProject-Swift.h”,它是隐藏的 . 但它是由app自动生成的 .
@sig答案是最好的之一,然而,它对我来说不适用于旧项目(不是新的!),我需要一些修改 . 经过很多变化后,我找到了我的食谱(使用XCode 7.2):
产品模块名称:$(PRODUCT_NAME:c99extidentifier)
定义模块:否
嵌入式内容包含Swift:NO
安装Objective-C兼容性 Headers :是
Objective-C Bridging Header:ProjectName-Bridging-Header.h
最后一点(5)至关重要 . 我只把它放在第二部分(Targets字段),Project字段应该留空:
否则,它没有为我生成正确的"Project-Swift.h"文件(它不包括swift方法) .
我花了大约4个小时试图在我的
Xcode
基于Objective-C的项目中启用Swift
. 我的“myproject-Swift.h
”文件已成功创建,但我的Xcode
没有看到我的Swift-classes
. 所以,我决定创建一个新的Xcode
基于Objc的项目,最后我找到了正确的答案!希望这篇文章能帮到某人:-)基于Xcode Objc的项目的Swift集成:
创建新的
*.swift
文件(在Xcode中)或使用Finder添加它当Xcode询问你时,创建一个
Objective-C bridging header
实现你的Swift类:
打开构建设置并检查这些参数:
Defines Module :
YES
myproject
YES
myproject-Swift.h
Objective-C Bridging Header :
$(SRCROOT)/myproject-Bridging-Header.h
在* .m文件中导入Swift接口标头
清理并重建您的Xcode项目
利润!
不要自己创建头文件 . 删除您创建的那个 .
确保您的Swift类标记为
@objc
或继承自NSObject
(直接或间接)派生的类 .如果您的项目中有任何编译器错误,Xcode将不会生成该文件 - 确保您的项目构建完整 .
允许Xcode完成其工作,不要手动添加/创建Swift标头 . 只需在Swift类之前添加@objc .
在您的项目设置中搜索以下标志并将其更改为YES(项目和目标)
然后清理项目并构建一次,在构建成功之后(它应该可能)导入到objective-c类.m文件中的头文件下面
Boooom!
对于那些拥有 Framework target 的人来说也许有帮助:
自动生成的头文件的 import statement 从应用目标看起来是 a bit different . 除了在其他答案中提到的其他事项使用
代替
根据Mix & Match上的Apples文档,用于框架目标 .
确保您的项目定义了一个模块,并为模块命名 . 然后重建,Xcode将创建
-Swift.h
头文件,您将能够导入 .您可以在项目设置中设置模块定义和模块名称 .
There is two condition,
在目标c文件中使用swift文件 .
在swift文件中使用目标c文件 .
So, For that purpose, you have to follow this steps:
在Objective-c项目中添加swift文件,反之亦然 .
创建 Headers (.h)文件 .
转到 Build Settings 并执行以下搜索步骤,
搜索此文本"brid"并设置头文件的路径 .
"Defines Module":是的 .
"Always Embed Swift Standard Libraries":是的 .
"Install Objective-C Compatibility Header":是的 .
之后,清理并重建您的项目 .
在目标c文件中使用swift文件 .
在这种情况下,首先在swift文件中编写“@objc” .
在那之后,在你的目标c文件中,写下这个,
在swift文件中使用目标c文件 .
在这种情况下,在您的头文件中,写下这个,
我希望这能帮到您 .
在我的情况下,除了这些步骤:
产品模块名称:myproject
定义模块:是
嵌入式内容包含Swift:是
安装Objective-C兼容性 Headers :是
Objective-C桥接 Headers :$(SRCROOT)/Sources/SwiftBridging.h
我需要将类设置为 public 才能创建 productName-Swift.h 文件:
我刚刚发现将swift文件目录添加到项目中是行不通的 . 您需要先为目录创建一个组,然后添加swift文件......
我遇到了同样的问题,最后看起来他们没有附加到同一个目标 . ObjC类附加到Target1和Target2,Swift类仅附加到Target1,并且在ObjC类中不可见 .
希望这有助于某人 .
我有同样的错误:找不到
myProjectModule-Swift.h
文件", but, in my case, real reason was in wrong deployment target: "Swift
在OS X早于10.9时不可用;请将MACOSX_DEPLOYMENT_TARGET
设置为10.9或更高版本(目前为'10.7')“因此,当我将部署目标更改为10.9时 - 项目已成功编译 .我的问题是-swift.h文件的自动生成无法理解CustomDebugStringConvertible的子类 . 我改为将类更改为NSObject的子类 . 之后,-swift.h文件现在正确地包含了该类 .
我的问题是我在xcode创建桥文件后卡住但仍然在头文件名MYPROJECTNAME-swift.h中出错
1.我检查终端并搜索所有自动创建的swift桥文件:
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -
你看到xcode创建了什么 .
在我的情况下
我遇到的问题是我会在我的objective-c桥接头中添加类,并且在导入的那些objective-c头文件中,他们试图导入swift头 . 它不喜欢那样 .
所以在我使用swift的所有objective-c类中,也是桥接的,关键是要确保在头文件中使用前向类声明,然后在.m文件中导入“* -Swift.h”文件 .
我没有必要更改构建中的任何设置或将@obj添加到类中 .
我所要做的就是创建bridge-header,这是在我将Swift类创建到Objective-c项目时自动创建的 . 然后我就必须这样做
导入“Bedtime-Swift.h”< - 需要使用该swift文件的objective-c文件内部 .
好吧,在阅读了所有评论并尝试阅读并再次尝试之后,我设法将swift类包含在我的Big obj-c项目中 . 所以,感谢所有的帮助 . 我想分享一个提示,帮助我更好地理解这个过程 . 在.m类中,转到swift目标名称#import“myTargetName-Swift.h”的导入行,然后单击键:
命令鼠标单击 - >跳转到定义
在那里你可以看到从swift到obj-c的所有翻译,你会发现在obj-c中重新声明了各种函数 . 希望这个提示能帮助你,就像它帮助我一样 .
完成上述所有操作后,我仍然遇到错误 . 我的问题最终是我所需的Swift文件由于某种原因没有添加到捆绑资源 .
我通过转到[MyTarget]> Build Phases> Copy Bundle Resources来修复此问题,然后单击加号按钮并添加了Swift文件 .