我在Swift中编写了一个库,但我无法将其导入到用Objective-C编写的当前项目中.
有没有办法导入它?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Bill.. 399
你需要导入TargetName-Swift.h
.请注意,它是目标名称 - 其他答案错误地使用了类名.
这个单独的文件是一个自动生成的头文件,它为项目中所有带有注释@objc
或继承的Swift类定义了Objective-C接口NSObject
.
注意事项:
如果您的目标名称包含空格,请将其替换为下划线(例如,My Project
变为My_Project-Swift.h
)
如果您的目标是框架,则需要导入
确保您的Swift文件是目标的成员
为什么这么难以记录? (70认同)
编辑:**注意:**为此工作,必须定义项目模块名称.请参阅:http://stackoverflow.com/a/24064015/2085743 (7认同)
我只想添加一个注释,如果您的项目名称有任何空格或特殊字符,则必须用下划线替换它们,例如"My App"将是"My_App-Swift.h" (7认同)
请注意,如果您尝试在导入中使用Swift文件名,则会收到错误"Expected';' 在顶级声明者之后".在"导入基础"之后的Swift文件中. (5认同)
@lelelo不,那个文件与这个文件相反.桥接头由开发人员编写,允许您将Objective-C和C符号引入Swift代码.Target-Swift.h文件是自动生成的,让您的Objective-C/C代码访问Swift符号. (3认同)
我找到了一种找到正确的生成头文件名的新方法:***转到目标->构建设置->搜索关键字`Objective-C生成的接口头名`***,宾果! (2认同)
Andrei Papan.. 145
Apple网站上的说明:
从同一框架将Swift代码导入Objective-C
在生成设置,在包装,确保定义模块 设置在该框架的目标被设定为是.使用此语法将该框架目标中的Swift代码导入该框架目标中的任何Objective-C .m文件并替换相应的名称:
#import"ProductName-Swift.h"
修订:
您只能在.m文件中导入"ProductName-Swift.h".
目标中的Swift文件将在包含此import语句的Objective-C .m文件中可见.
要避免循环引用,请不要将Swift导入Objective-C头文件.相反,您可以转发声明Swift类以在Objective-C头中使用它.请注意,您不能在Objective-C中子类化Swift类.
你需要导入TargetName-Swift.h
.请注意,它是目标名称 - 其他答案错误地使用了类名.
这个单独的文件是一个自动生成的头文件,它为项目中所有带有注释@objc
或继承的Swift类定义了Objective-C接口NSObject
.
注意事项:
如果您的目标名称包含空格,请将其替换为下划线(例如,My Project
变为My_Project-Swift.h
)
如果您的目标是框架,则需要导入 <TargetName/TargetName-Swift.h>
确保您的Swift文件是目标的成员
这是做什么的:
在Objective-C中创建一个新项目
创建一个新.swift
文件
将出现一个弹出窗口,询问"您是否要配置Objective-C桥接标头".
选择是.
单击您的Xcode项目文件
单击Build Settings
找到搜索栏并搜索" 定义模块".
将值更改为是.
搜索产品模块名称.
将值更改为项目名称.
在App委托中,添加以下内容: #import "YourProjectName-Swift.h"
注意: 每当您想要使用Swift文件时,必须按照以下行导入:
#import "YourProjectName-Swift.h"
Apple网站上的说明:
从同一框架将Swift代码导入Objective-C
在生成设置,在包装,确保定义模块 设置在该框架的目标被设定为是.使用此语法将该框架目标中的Swift代码导入该框架目标中的任何Objective-C .m文件并替换相应的名称:
#import"ProductName-Swift.h"
修订:
您只能在.m文件中导入"ProductName-Swift.h".
目标中的Swift文件将在包含此import语句的Objective-C .m文件中可见.
要避免循环引用,请不要将Swift导入Objective-C头文件.相反,您可以转发声明Swift类以在Objective-C头中使用它.请注意,您不能在Objective-C中子类化Swift类.
如果你正在使用Cocoapods并试图在ObjC项目中使用Swift pod,你可以简单地执行以下操作:
@import <FrameworkName>;
转到项目文件中的构建设置并搜索"Objective-C生成的接口标题名称.该属性的值是您应该包含的名称.
如果您的"产品模块名称"属性(默认情况下上述属性所依赖的属性)取决于您是否编译test/debug/release/etc(就像我的情况一样),那么使此属性独立于此通过设置自定义名称进行更改.
第一步:-
选择项目目标 - >构建设置 - >搜索('定义') - > 定义模块 更新值否为是
"定义模块":是的.
"始终嵌入Swift标准库":是的.
"安装Objective-C兼容性标题":是.
第二步:-
在Objective C".h"文件中添加Swift文件类,如下所示
#import <UIKit/UIKit.h> @class TestViewController(Swift File); @interface TestViewController(Objective C File) : UIViewController @end
在Objective C".m"文件中导入'ProjectName(您的项目名称)-Swift.h'
//TestViewController.m #import "TestViewController.h" /*import ProjectName-Swift.h file to access Swift file here*/ #import "ProjectName-Swift.h"
如果Swift
内部导入文件Objective-c
不import
正确,则会导致此错误.
注意:您不必在外部导入Swift文件,只需导入一个文件来处理swift文件.
当你创建/复制斯威夫特文件中的Objective-C项目.它会自动创建一个桥接头.
检查Objective-C Generated Interface Header Name
的Targets -> Build Settings
.
基于上面,我将按KJExpandable-Swift.h
原样导入.
你的将是TargetName-Swift.h
,如果TargetName
根据你的项目名称不同或其他目标您可能已经加入和在其上运行.
如下所示我的目标是KJExpandable
,所以它是KJExpandable-Swift.h
如果您将Swift代码导入到同一框架内的 Objective-C文件中,则需要注意一点.您必须通过指定框架名称和尖括号来执行此操作:
#import <MyFramework/MyFramework-Swift.h>
MyFramework
这是"产品模块名称"构建设置(PRODUCT_NAME = MyFramework
).
简单地添加#import "MyFramework-Swift.h"
将无效.如果你检查构建的产品目录(在#import
添加这样的目录之前,所以你至少有一个成功的构建在目标中有一些Swift代码),那么你仍然应该MyFramework-Swift.h
在Headers
目录中看到该文件.
如果您有一个在Swift 4中创建的项目,然后添加了Objective-C文件,请执行以下操作:
@objcMembers public class MyModel: NSObject { var someFlag = false func doSomething() { print("doing something") } }
参考:https : //useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/