【问题标题】:How can I import Swift code to Objective-C?如何将 Swift 代码导入到 Objective-C?
【发布时间】:2014-07-28 22:05:38
【问题描述】:

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

有什么方法可以导入吗?

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

【问题讨论】:

标签: objective-c import swift


【解决方案1】:

在同一个项目中查看有关 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"

【讨论】:

  • 显示了这个错误:'SCLAlertView-Swift.h' 文件未找到。
  • 需要是项目名称,而不是文件名 - 请参阅我的答案。
  • 感谢文档链接。这对参考很有用。
  • 引用提供的链接:The name of this header is your product module name followed by adding "-Swift.h". 所以这不是你写的类名,而是你的产品模块的名称,它负责导入所有 swift 文件,而不仅仅是一个特定的文件
【解决方案2】:

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

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

注意事项:

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

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

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

【讨论】:

  • 请注意,如果您尝试在导入中使用 Swift 文件名,您将收到错误“Expected ';'在顶级声明符之后”。在“import Foundation”之后的 Swift 文件中。
  • 编辑:注意:为此,必须定义项目模块名称。见:stackoverflow.com/a/24064015/2085743
  • 我只是想补充一点,如果您的项目名称有任何空格或特殊字符,您必须用下划线替换它们,例如“My App”将是“My_App-Swift.h”
  • 为什么这么难且文档记录不完善?
  • @lelelo 不,该文件与该文件相反。桥接头由开发人员编写,可让您将 Objective-C 和 C 符号带入您的 Swift 代码。 Target-Swift.h 文件会自动生成,并让您的 Objective-C/C 代码访问 Swift 符号。
【解决方案3】:

来自 Apple 网站的说明:

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

Build Settings 下的 Packaging 中,确保 Defines Module 该框架目标的设置设置为Yes。导入 Swift 代码 从该框架目标到该框架内的任何 Objective-C .m 文件 使用此语法的框架目标并替换适当的 名称:

#import "ProductName-Swift.h"

修订:

您只能在 .m 文件中导入 "ProductName-Swift.h"

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

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

【讨论】:

  • 仅在 .m 文件中导入“ProductName-Swift.h”对我有帮助。在 .pch 文件中添加相同的内容是“找不到 'CLLocationManagerDelegate' 的协议声明;您的意思是 'NSLayoutManagerDelegate'?”
  • @AJit 它不直接,文档说。最简单的方法是创建一个转换为 Objective-C++ 可以理解的格式的 Objective-C 类。 developer.apple.com/library/ios/documentation/Swift/Conceptual/…
  • 请注意,您必须从NSObject 派生!!!您不能直接在 swift 中直接声明 class Blah 并让它工作。它必须是class Blah : NSObject
  • 在某些情况下值得阅读此答案:stackoverflow.com/questions/26328034/… 取决于您在做什么:#import #import #import
  • 如果你想导入一个 Swift 扩展怎么办?
【解决方案4】:

请执行以下操作:

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

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

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

  4. 点击构建设置

  5. 找到搜索栏并搜索Defines Module

  6. 将值更改为Yes

  7. 搜索产品模块名称

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

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


注意:每当你想使用你的 Swift 文件时,你必须导入以下行:

#import "YourProjectName-Swift.h"

【讨论】:

  • Build settingsDefines module 的值更改为Yes 对我来说是固定的事情!
  • 嵌入内容包含 Swift:是的,也使用这个
  • 不错的答案,但在 Xcode 7.3.1 及更高版本中不需要步骤 7-8
  • xcode 8.3.2 中不适用于我。在以前的版本中工作
  • 只想在#import "YourProjectName-Swift.h" 中添加YourProjectName 将是第8 步中的项目名称。如果您的项目名称包含特殊字符并且您不确定应该如何格式化它,这很有用。
【解决方案5】:

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

@import <FrameworkName>;

【讨论】:

  • 非常感谢!你拯救了我的一天。
  • 如果我们通过 Cocoapods 安装 swift-made 库,这就像一个魅力。点赞!!!
【解决方案6】:

转到项目文件中的构建设置并搜索“Objective-C Generated Interface Header Name该属性的值是您应该包含的名称。

如果您的“产品模块名称”属性(上述属性默认依赖的属性)取决于您是否为测试/调试/发布/等进行编译(就像我的情况一样),请设置此属性通过设置自定义名称独立于该变体。

【讨论】:

    【解决方案7】:

    如果你想在 Objective-C 类中使用 Swift 文件,那么从 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) 编译,而不是架构 x86_64 或 armv 7 的先前文件 (2.0)

    再做一个改变

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

    构建并运行。

    【讨论】:

    • 我没有得到使用旧版 swift 语言版本的选项
    【解决方案8】:

    第一步:-

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

    “定义模块”:

    “始终嵌入 Swift 标准库”:

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

    第二步:-

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

    #import <UIKit/UIKit.h>
    
    @class TestViewController(Swift File);
    
    @interface TestViewController(Objective C File) : UIViewController
    
    @end
    

    在Objective C ".m" 文件中导入'ProjectName(Your Project Name)-Swift.h'

    //TestViewController.m 
    #import "TestViewController.h"
    
    /*import ProjectName-Swift.h file to access Swift file here*/
    
    #import "ProjectName-Swift.h"
    

    【讨论】:

    • 类的前向声明(@class)是一个非常好的点!谢谢!
    【解决方案9】:

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

    注意:您不必从外部导入 Swift 文件,只需导入一个负责处理 swift 文件的文件。

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

    检查Objective-C Generated Interface Header NameTargets -&gt; Build Settings

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

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

    因为下面我的目标是KJExpandable,所以它是KJExpandable-Swift.h

    【讨论】:

      【解决方案10】:

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

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

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

      【讨论】:

      • 比认可的好。破折号浪费了 20 分钟,我再也回不来了哈哈。
      【解决方案11】:

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

      #import &lt;MyFramework/MyFramework-Swift.h&gt;

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

      仅仅添加#import "MyFramework-Swift.h" 是行不通的。如果您检查构建的产品目录(在添加这样的 #import 之前,因此您至少已经成功构建了一个目标中的一些 Swift 代码),那么您仍然应该在 @987654327 中看到文件 MyFramework-Swift.h @目录。

      【讨论】:

        【解决方案12】:

        在项目中找到 .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
        

        【讨论】:

          【解决方案13】:

          如果您有一个在 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 之后。它不起作用
          • 您遇到了什么错误?我在 Swift4.2 中使用了上面的代码,并且工作正常。
          • 好的,太好了。
          【解决方案14】:

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

          【讨论】:

            【解决方案15】:
            #import <TargetName-Swift.h>
            

            当你从键盘输入 #import

            【讨论】:

              【解决方案16】:

              只是关于语法的一些小技巧,关于Xcode的一切都已经说了

              1. 你不能导入“纯”函数,只能导入类,即使标记为“public”,所以:

                公共函数 f1(){ 打印(“f1”); }

              不会以任何方式调用。

              1. 如果你写了类,添加从 NSObject 的继承,其他的将不可用。

              2. 如果继承自NSObject,如下:

                类实用程序:NSObject{

                静态函数 aaa()->String{ 返回“AAA” }

                @objc 静态函数 bbb()->字符串{ 返回“BBB” }

                @objc 私有静态函数 ccc()->String{ 返回“CCC” }

                }

              在 OBJC 中:

              aaa() 未调用:“选择器 'aaa' 没有已知的类方法”

              bbb() 好的

              ccc() 未调用:“选择器 'aaa' 没有已知的类方法”

              【讨论】:

                猜你喜欢
                • 2015-11-30
                • 1970-01-01
                • 2018-07-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多