如何将Swift代码导入Objective-C?


Answers:


430

您需要导入TargetName-Swift.h。请注意,这是目标名称-其他答案会导致使用类名称的错误。

这个单个文件是一个自动生成的标头,它为项目中所有用注释@objc或继承的Swift类定义了Objective-C接口NSObject

注意事项:

  • 如果您的目标名称包含空格,请用下划线替换(例如,My Project成为My_Project-Swift.h

  • 如果您的目标是框架,则需要导入 <TargetName/TargetName-Swift.h>

  • 确保您的Swift文件是目标文件的成员


5
请注意,如果尝试在导入中使用Swift文件名,则会收到错误“ Expected';” 在顶级声明器之后”。在“导入基金会”之后的Swift文件中。
louielouie 2014年

8
编辑:注意:为了使它起作用,必须定义项目模块名称。请参阅:stackoverflow.com/a/24064015/2085743
鲁宾·马丁内斯(Ruben Martinez)

7
我只想补充一点,如果您的项目名称带有空格或特殊字符,则必须用下划线替换,例如“我的应用程序”将是“ My_App-Swift.h”
Hola Soy Edu Feliz Navidad

84
为什么这是如此困难且记录不充分?
uchuugaka 2015年

3
@lelelo不,该文件与此文件相反。桥接标头由开发人员编写,可让您将Objective-C和C符号引入您的Swift代码中。Target-Swift.h文件会自动生成,并让您的Objective-C / C代码访问Swift符号。
比尔

154

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类。

在此处输入图片说明


2
仅在.m文件中导入“ ProductName-Swift.h”对我有所帮助。在.pch文件中添加相同的内容是:“找不到'CLLocationManagerDelegate'的协议声明;您是说'NSLayoutManagerDelegate'吗?”
Alphonse R. Dsouza 2015年

@AJit并非直接如此,该文档说。最简单的方法是创建一个Objective-C类,该类以Objective-C ++可以理解的格式进行翻译。developer.apple.com/library/ios/documentation/Swift/Conceptual/...
亚历杭德罗·伊万

1
请注意,您必须派生自NSObject!!! 您不能立即class Blah 迅速声明a 并使其起作用。它必须是class Blah : NSObject
David T.

在某些情况下值得阅读此答案:stackoverflow.com/questions/26328034/… 根据您的工作:#import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333

如果要导入Swift扩展怎么办?
里卡多

150

这是做什么的:

  1. 在Objective-C中创建一个新项目

  2. 创建一个新.swift文件  

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

  4. 点击构建设置

  5. 找到搜索栏,然后搜索“ 定义模块”

  6. 将值更改为Yes

  7. 搜索产品模块名称

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

  9. 在应用程序委托中,添加以下内容: #import "YourProjectName-Swift.h"


注意: 无论何时要使用Swift文件,都必须在以下行中导入:

#import "YourProjectName-Swift.h"


1
更改的值Defines moduleBuild settingsYes什么东西固定给我!
Zakaria Braksa,2015年

嵌入式内容包含Swift:是的,也请使用
Mohit16年

4
好的答案,但是在Xcode 7.3.1和更高版本中不需要步骤7-8
Sam B

为我工作!谢谢。
itsdamslife

1
只是想补充一点,YourProjectName#import "YourProjectName-Swift.h"将项目的名称从第8步有用的,如果你的项目名称包含特殊字符,你不知道你应该究竟如何格式化。
查克·鲍里斯

40

如果您正在使用Cocoapods并尝试在ObjC项目中使用Swift吊舱,则只需执行以下操作:

@import <FrameworkName>;

在此处输入图片说明


1
非常感谢!你救了我的一天。
Esha

如果我们通过Cocoapods安装了快速制作的库,这就像一个魅力。已投票!!!
NSPratik '18

21

转到项目文件中的构建设置,然后搜索“ Objective-C生成的接口头名称”该属性的值是您应包括的名称。

如果您的“产品模块名称”属性(上述属性默认情况下所依赖的属性)根据您是否为test / debug / release / etc进行编译而有所不同(就像我的情况一样),则使该属性独立于通过设置自定义名称来实现变体。


15

如果未正确导入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
在此处输入图片说明


12

第一步:-

选择项目目标->构建设置->搜索('定义')-> 定义模块 更新值,从

“定义模块”:YES

“始终嵌入Swift标准库”:

“安装Objective-C兼容性标题”:

在此处输入图片说明

第二步:-

在目标C“ .h”文件中添加Swift文件类,如下所示

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

在目标C“ .m”文件中导入“ ProjectName(您的项目名称)-Swift.h”

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

该类的前向声明(@class)是非常好的一点!谢谢!
菲利普·奥托

10

如果要在同一框架将Swift代码导入到Objective-C文件中,则有一个警告。您必须指定框架名称和尖括号:

#import <MyFramework/MyFramework-Swift.h>

MyFramework这是“产品模块名称”构建设置(PRODUCT_NAME = MyFramework)。

简单地添加#import "MyFramework-Swift.h"将不起作用。如果检查生成的产品目录(在#import添加该目录之前,因此您至少已成功完成构建并在目标中添加了一些Swift代码),那么您仍应MyFramework-Swift.hHeaders目录中看到该文件。


8

如果您有一个在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/


在我的代码中,将其从swift 3更新到Swift 4.2之后。它不起作用
SNarula

你遇到了什么错误?我已经在Swift4.2中使用了上面的代码,并且工作正常。
Prashant Bhayani

太棒了。
Prashant Bhayani

4

在同一项目中签出有关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"

3
向我显示此错误:找不到“ SCLAlertView-Swift.h”文件。
维克多·拉德琴科

2
需要是项目名称,而不是文件名-请参阅我的答案。
比尔

1
感谢您的文档链接。这对于参考很有用。
louielouie 2014年

2
在提供的链接中引用:The name of this header is your product module name followed by adding "-Swift.h".因此,它不是您编写的类名,而是产品模块的名称,它负责导入所有快速文件,而不仅仅是一个特定的文件
Chris

4

在您要构建的目标的构建设置中搜索“ Objective-C生成的接口头名称”(假设是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"


比批准的要好。破折号浪费了20分钟,我再也回不到哈哈。
罗伊·穆利亚

3

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

对其进行编译,如果它会生成链接器错误,例如:对于架构x86_64或armv 7,使用比以前的文件(2.0)更高的Swift语言(3.0)版本进行编译。

再改变一次

  1. Xcode->项目->目标->构建设置->使用旧版Swift语言版本->是

生成并运行。


1
我没有使用旧版快速语言版本的选项
rd_

1

请注意破折号和下划线,它们可能会混淆,并且您的项目名称和目标名称将与SWIFT_MODULE_NAME不同。

短划线和下划线


1
#import <TargetName-Swift.h>

当您从键盘#import <输入时,您会看到,然后Xcode会自动为您提供建议。


-1

在项目中找到.PCH文件。然后添加 #import "YourProjectName-Swift.h"这将导入类标题。这样您就不必导入到特定文件中。

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.