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

How can I import Swift code to Objective-C?

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

有什么方法可以导入它吗?

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


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

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

考虑事项:

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

  • 如果目标是框架,则需要导入

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


苹果网站上的说明:

To import Swift code into Objective-C from the same framework

Under Build Settings, in Packaging, make sure the Defines Module
setting for that framework target is set to Yes. Import the Swift code
from that framework target into any Objective-C .m file within that
framework target using this syntax and substituting the appropriate
names:

#import"ProductName-Swift.h"

修订:

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

The Swift files in your target will be visible in Objective-C .m files
containing this import statement.

To avoid cyclical references, don’t import Swift into an Objective-C
header file. Instead, you can forward declare a Swift class to use it
in an Objective-C header. Note that you cannot subclass a Swift class
in Objective-C.

enter image description here


以下是要做的:

  • 在目标C中创建新项目

  • 创建新的.swift文件nbsp;

    • 将出现一个弹出窗口并询问"是否要配置Objective-C桥接头"。
    • 选择"是"。
  • 单击Xcode项目文件

  • 单击"生成设置"

  • 查找搜索栏并搜索定义模块。

  • 将值更改为"是"。

  • 搜索产品模块名称。

  • 将该值更改为项目的名称。

  • 应用程序内委托,增加以下内容:#import"YourProjectName-Swift.h"

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

    #import"YourProjectName-Swift.h"


    如果您在objc项目中使用cocoapods并尝试使用swift pod,那么只需执行以下操作:

    @import ;

    enter image description here


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

    如果您的"产品模块名称"属性(默认情况下,上述属性所依赖的属性)因您是否为测试/debug/release/etc编译而不同(与我的情况类似),则通过设置自定义名称使此属性独立于该变化。


    如果在Objective-c中导入Swift文件不正确,可能会导致此错误。

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

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

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

    enter image description here

    基于以上,我将按原样进口KJExpandable-Swift.h

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

    我的目标是KJExpandable,所以是KJExpandable-Swift.henter image description here


    第一步:

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

    "定义模块":是。

    "始终嵌入Swift标准库":是。

    "Install objective-c compatibility header":是。

    enter image description here

    第二步:

    在目标C".h"文件中添加swift文件类,如下所示

    1
    2
    3
    4
    5
    6
    7
    #import <UIKit/UIKit.h>

    @class TestViewController(Swift File);

    @interface TestViewController(Objective C File) : UIViewController

    @end

    在目标c.m文件中导入'project name(您的项目名称)-swift.h'

    1
    2
    3
    4
    5
    6
    //TestViewController.m
    #import"TestViewController.h"

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

    #import"ProjectName-Swift.h"


    如果在同一框架内将swift代码导入到objective-c文件中,有一个警告。必须指定框架名称和尖括号:

    #import

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

    简单地添加#import"MyFramework-Swift.h"是行不通的。如果您检查build products目录(在添加这样一个#import之前,所以您至少有一个成功的构建,目标中有一些swift代码),那么您仍然应该在Headers目录中看到文件MyFramework-Swift.h


    如果您在Swift 4中创建了一个项目,然后添加了Objective-C文件,请这样做:

    1
    2
    3
    4
    5
    6
    7
    @objcMembers
    public class MyModel: NSObject {
        var someFlag = false        
        func doSomething() {        
            print("doing something")
        }
    }

    参考:https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/


    查看同一项目中关于Swift和Objective C的预发布说明

    https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptive/buildingcoaapps/mixandmatch.html//apple-ref/doc/uid/tp40014216-ch10-xid_

    您应该导入

    1
    #import"SCLAlertView-Swift.h"


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

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

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


    如果要将Swift文件用于Objective-C类,那么从Xcode 8开始,可以执行以下步骤:

    如果您在目标C中创建了项目:

  • 创建新的swift文件
  • Xcode将自动提示输入桥接头文件
  • 生成它
  • 在Objective-C控制器中导入"project name swift.h"(在实现中导入,而不是在接口中导入)(如果项目名称之间有空格,请使用下划线"project-name-swift.h")。
  • 您将能够在swift中访问您的objective-c类。
  • 编译它,如果它将生成链接器错误,例如:使用比以前的文件(2.0)更高版本的swift语言(3.0)编译架构x86_64或armv 7

    在您的

  • xcode->project->target->build settings->use legacy swift language version->yes
  • 建立和运行。


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #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