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

时间:2014-06-08 01:08:00

标签: objective-c import swift

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

有没有办法导入它?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

15 个答案:

答案 0 :(得分:373)

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

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

考虑:

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

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

  • 确保您的Swift文件是目标

  • 的成员

答案 1 :(得分:137)

Apple网站上的说明:

  

从同一框架将Swift代码导入Objective-C

     

构建设置下,在打包中,确保定义模块   该框架目标的设置设置为。导入Swift代码   从该框架目标到其中的任何Objective-C .m文件   框架目标使用此语法并替换相应的   名称:

     

#import&#34; ProductName-Swift.h&#34;

<强>修订:

您只能在.m文件中导入&#34; ProductName-Swift.h&#34;

  

目标中的Swift文件将在Objective-C .m文件中可见   包含此导入语句。

     

要避免循环引用,请不要将Swift导入Objective-C   头文件。相反,您可以转发声明Swift类来使用它   在Objective-C标题中。请注意,您不能将Swift类子类化   在Objective-C中。

enter image description here

答案 2 :(得分:130)

以下是该怎么做:

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

  2. 创建新的.swift文件

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

  4. 点击构建设置

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

  6. 将值更改为

  7. 搜索产品模块名称

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

  9. 在App代理中,添加以下内容:#import "YourProjectName-Swift.h"

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

    #import "YourProjectName-Swift.h"

答案 3 :(得分:32)

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

  

@import <FrameworkName>;

enter image description here

答案 4 :(得分:16)

转到项目文件中的构建设置,然后搜索&#34; Objective-C生成的界面标题名称该属性的值是您应该包含的名称。

如果您的&#34;产品模块名称&#34;属性(默认情况下上面属性所依赖的属性)取决于您是否编译test / debug / release / etc(就像我的情况一样),然后通过设置自定义名称使该属性独立于该变体。

答案 5 :(得分:11)

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.hTargetName根据您的项目名称或您可能添加并运行的其他目标而有所不同。

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

答案 6 :(得分:9)

第一步: -

选择项目目标 - &gt;构建设置 - &gt;搜索('定义') - &gt; 定义模块 将值更新为

“定义模块”:

“始终嵌入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"

答案 7 :(得分:8)

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

#import <MyFramework/MyFramework-Swift.h>

MyFramework这是&#34;产品模块名称&#34;构建设置(PRODUCT_NAME = MyFramework)。

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

答案 8 :(得分:5)

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

答案 9 :(得分: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"

答案 10 :(得分:3)

在您要构建的目标的构建设置中搜索“Objective-C生成的界面标题名称”(假设它是MyApp-Swift.h),并导入值您尝试访问Swift API的源文件中的此设置(#import "MyApp-Swift.h")。

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

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

答案 11 :(得分: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类。
  6. 编译它,如果它会生成链接器错误,例如:使用较新版本的Swift语言(3.0)编译,而不是以前的文件(2.0),用于体系结构x86_64或armv 7

    中再做一次更改
    1. Xcode - &gt;项目 - &gt;目标 - &gt;构建设置 - &gt;使用Legacy Swift语言版本 - &gt;是
    2. 构建并运行。

答案 12 :(得分:1)

#import <TargetName-Swift.h>

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

答案 13 :(得分:0)

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

Dashes and underscores

答案 14 :(得分:-1)

在项目中找到.PCH文件。然后添加The following packages will be DOWNGRADED: conda: 4.5.4-py27_0 --> 4.2.16-py27_0 conda-build: 3.10.5-py27_0 --> 3.9.2-py27_0 Proceed ([y]/n)? y Preparing transaction: done Verifying transaction: done Executing transaction: failed ERROR conda.core.link:_execute(502): An error occurred while uninstalling package 'defaults::conda-build-3.10.5-py27_0'. WindowsError(5, 'Access is denied') Attempting to roll back. Rolling back transaction: done WindowsError(5, 'Access is denied') 这将导入类标题。这样您就不必导入特定文件。

#import "YourProjectName-Swift.h"