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

问题描述 投票:251回答:14

我在Swift中编写了一个库,但我无法将其导入到用Objective-C编写的当前项目中。

有没有办法导入它?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
objective-c import swift
14个回答
387
投票

你需要导入TargetName-Swift.h。请注意,它是目标名称 - 其他答案错误地使用了类名。

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

注意事项:

  • 如果您的目标名称包含空格,请用下划线替换它们(例如My Project变为My_Project-Swift.h
  • 如果您的目标是框架,则需要导入<TargetName/TargetName-Swift.h>
  • 确保您的Swift文件是目标的成员

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"

4
投票

在您尝试构建的目标的构建设置中搜索“Objective-C Generated Interface Header Name”(假设它是MyApp-Swift.h),并在您尝试的源文件中导入此设置的值(#import "MyApp-Swift.h")访问您的Swift API。

该字段的默认值为$(SWIFT_MODULE_NAME)-Swift.h。如果双击“Objective-C Generated Interface Header Name”设置的值字段,则可以看到它。

此外,如果您的模块名称中有破折号(假设它是My-App),那么在$(SWIFT_MODULE_NAME)中,所有破折号都将替换为下划线。那么你将不得不添加#import "My_App-Swift.h"


2
投票

如果要将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 - > Project - > Target - > Build Settings - >使用Legacy Swift语言版本 - >是

构建并运行。


0
投票

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

Dashes and underscores


0
投票
#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

139
投票

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


136
投票

这是做什么的:

  1. 在Objective-C中创建一个新项目
  2. 创建一个新的.swift文件 将出现一个弹出窗口,询问“您是否要配置Objective-C桥接标头”。 选择是。
  3. 单击您的Xcode项目文件
  4. 单击Build Settings
  5. 找到搜索栏并搜索“定义模块”。
  6. 将值更改为是。
  7. 搜索产品模块名称。
  8. 将值更改为项目名称。
  9. 在App委托中,添加以下内容:#import "YourProjectName-Swift.h"

注意:每当您想要使用Swift文件时,必须按照以下行导入:

#import "YourProjectName-Swift.h"


33
投票

如果你正在使用Cocoapods并试图在ObjC项目中使用Swift pod,你可以简单地执行以下操作:

@import <FrameworkName>;

enter image description here


17
投票

转到项目文件中的构建设置并搜索“Objective-C生成的接口标题名称。该属性的值是您应该包含的名称。

如果您的“产品模块名称”属性(默认情况下上述属性所依赖的属性)取决于您是否编译test / debug / release / etc(就像我的情况一样),那么使此属性独立于此通过设置自定义名称进行更改。


12
投票

Swift中导入Objective-c文件会导致此错误,如果它没有正确import

注意:您不必在外部导入Swift文件,只需导入一个文件来处理swift文件。

在Objective-C项目中创建/复制Swift文件时。它会自动创建一个桥接头。

Objective-C Generated Interface Header Name查看Targets -> Build Settings

enter image description here

基于上面,我将原样导入KJExpandable-Swift.h

你的将是TargetName-Swift.h,其中TargetName根据你的项目名称或你可能已添加并运行的其他目标而有所不同。

如下所示我的目标是KJExpandable,所以它是KJExpandable-Swift.h enter image description here


9
投票

第一步:-

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

“定义模块”:是的。

“始终嵌入Swift标准库”:是的。

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

enter image description here

第二步:-

在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"

8
投票

如果您将Swift代码导入到同一框架内的Objective-C文件中,则需要注意一点。您必须通过指定框架名称和尖括号来执行此操作:

#import <MyFramework/MyFramework-Swift.h>

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

简单地添加#import "MyFramework-Swift.h"将无法正常工作。如果你检查构建的产品目录(在添加这样的#import之前,所以你至少有一个成功的构建在目标中有一些Swift代码),那么你仍然应该在MyFramework-Swift.h目录中看到文件Headers


6
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.