如何将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类。

在这里输入图像描述

这是做什么:

  1. 在ObjC中创建一个新的项目

  2. 创建一个新的.swift文件

    • 将出现一个弹出窗口,询问“你想配置一个Objective-C桥接头”
    • 选择
  3. 点击你的Xcode项目文件

  4. 点击Build Settings

  5. 找到搜索栏并搜索定义模块

  6. 将值更改为

  7. 搜索产品模块名称

  8. 将值更改为您的项目的名称。

  9. 在应用程序委托中,添加以下内容: #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的预发布说明

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

你应该进口

 #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中创建了项目:

  1. 创建新的Swift文件
  2. Xcode会自动提示输入Bridge-Header文件
  3. 生成它
  4. 在你的Objective-C控制器中导入“ProjectName-Swift.h”(在实现中不导入接口)(如果你的项目在名称之间有空格,所以使用下划线“Project_Name-Swift.h”)
  5. 你将能够在Swift中访问你的Objective-C类。

编译它,如果它会产生链接器错误,如:使用较新版本的Swift语言(3.0)编译而不是以前的文件(2.0)的架构x86_64或armv 7

多做一点改变

  1. Xcode – >项目 – >目标 – >生成设置 – >使用传统的Swift语言版本 – >是的

建立和运行。

有一个警告,如果你在同一个框架导入Swift代码到你的Objective-C文件。 您必须使用指定框架名称和尖括号来执行此操作:

#import <MyFramework/MyFramework-Swift.h>

这里的MyFramework是“产品模块名称”版本设置( PRODUCT_NAME = MyFramework )。

只需添加#import "MyFramework-Swift.h"将不起作用。 如果你检查构建的产品目录(在这样的#import被添加之前,所以你至少有一个成功的构建与目标中的一些Swift代码),那么你仍然应该看到在头文件MyFramework-Swift.h目录。