如何将Swift代码导入Objective-C
我在Swift SCLAlertView-Swift上编写了一个库,我无法将它导入到我目前的项目(Objective-C)
有什么方法可以导入吗?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
你需要导入TargetName-Swift.h
。 请注意,这是目标名称 – 其他答案使用类名的错误。
这个单个文件是一个自动生成的头文件,它为项目中的所有Swift类定义了Objective-C接口,这些接口既可以注释@objc
,也可以从NSObject
继承。
如果您的目标名称包含空格,请将其替换为下划线(例如,“我的项目”变为“My_Project-Swift.h”)
苹果网站上的说明:
将Swift代码从同一个框架导入到Objective-C中
在“ 生成设置”下的“ 打包”中 ,确保将该框架目标的“ 定义模块”设置设置为“ 是” 。 将该框架目标中的Swift代码导入该框架目标中的任何Objective-C .m文件,并使用此语法替换适当的名称:
#import“ProductName-Swift.h”
修订:
您只能在.m文件中导入“ProductName-Swift.h” 。
目标中的Swift文件将在包含此导入语句的Objective-C .m文件中可见。
为避免循环引用,请不要将Swift导入到Objective-C头文件中。 相反,你可以转发声明一个Swift类来在Objective-C头文件中使用它。 请注意,您不能在Objective-C中继承Swift类。
这是做什么:
-
在ObjC中创建一个新的项目
-
创建一个新的
.swift
文件- 将出现一个弹出窗口,询问“你想配置一个Objective-C桥接头” 。
- 选择是 。
-
点击你的Xcode项目文件
-
点击Build Settings
-
找到搜索栏并搜索定义模块 。
-
将值更改为是 。
-
搜索产品模块名称 。
-
将值更改为您的项目的名称。
-
在应用程序委托中,添加以下内容:
#import "YourProjectName-swift.h"
注意:只要你想使用你的Swift文件,你必须添加下面一行:
#Import "YourProjectName-swift.h"
如果您正在使用Cocoapods并尝试在ObjC项目中使用Swift窗格,则可以简单地执行以下操作:
@import <FrameworkName>;
转到在您的项目文件中建立设置并搜索“Objective-C生成的接口标题名称” 。 该属性的值是您应该包含的名称。
如果您的“产品模块名称”属性(上述属性默认取决于该属性)取决于您是否编译测试/调试/发布/等(如在我的情况下),然后使此属性独立于通过设置自定义名称的变化。
在Objective-c
导入Swift
文件可能会导致这个错误,如果import
不正确的话。
注意:您不必从外部导入Swift文件,只需导入一个文件来处理swift文件。
在Objective-C项目中 创建/复制Swift文件时 。 它会自动创建一个桥接头。
在Targets -> Build Settings
检查Objective-C Generated Interface Header Name
。
基于上面,我将导入KJExpandable-Swift.h
。
您的将是TargetName-Swift.h
,其中TargetName
根据您的项目名称或您可能添加并运行的另一个目标而不同。
如下所示,我的目标是KJExpandable
,所以它是KJExpandable-Swift.h
第一步:-
选择Project Target – > Build Setting – > Search('Define') – > Define Module update value No to Yes
“定义模块”: 是 。
“总是嵌入Swift标准库”: 是的 。
“安装Objective-C兼容性头”: 是 。
第二步: –
在目标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 "SCLAlertView-Swift.h"
在你想要构建的目标的Build Settings中搜索“Objective-C Generated Interface Header Name” (假设它是MyApp-Swift.h
),然后导入这个设置( #import "MyApp-Swift.h"
)的值#import "MyApp-Swift.h"
)在你想要访问你的Swift API的源文件中。
该字段的默认值是$(SWIFT_MODULE_NAME)-Swift.h
。 如果双击“Objective-C生成的接口标题名称”设置的值字段,则可以看到它。
另外,如果你的模块名称中有破折号(假设它是My-App
),那么在$(SWIFT_MODULE_NAME)
所有破折号将被下划线替换。 那么你必须添加#import "My_App-Swift.h"
。
如果您想将Swift文件用于Objective-C类,那么从Xcode 8开始,您可以按照以下步骤操作:
如果您已经在Objective-C中创建了项目:
- 创建新的Swift文件
- Xcode会自动提示输入Bridge-Header文件
- 生成它
- 在你的Objective-C控制器中导入“ProjectName-Swift.h”(在实现中不导入接口)(如果你的项目在名称之间有空格,所以使用下划线“Project_Name-Swift.h”)
- 你将能够在Swift中访问你的Objective-C类。
编译它,如果它会产生链接器错误,如:使用较新版本的Swift语言(3.0)编译而不是以前的文件(2.0)的架构x86_64或armv 7
多做一点改变
- Xcode – >项目 – >目标 – >生成设置 – >使用传统的Swift语言版本 – >是的
建立和运行。
有一个警告,如果你在同一个框架内导入Swift代码到你的Objective-C文件。 您必须使用指定框架名称和尖括号来执行此操作:
#import <MyFramework/MyFramework-Swift.h>
这里的MyFramework
是“产品模块名称”版本设置( PRODUCT_NAME = MyFramework
)。
只需添加#import "MyFramework-Swift.h"
将不起作用。 如果你检查构建的产品目录(在这样的#import
被添加之前,所以你至少有一个成功的构建与目标中的一些Swift代码),那么你仍然应该看到在头文件MyFramework-Swift.h
目录。