繁体   English   中英

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

[英]How can I import Swift code to Objective-C?

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

有什么办法可以导入吗?

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

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

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

注意事项:

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

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

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

以下是该怎么做:

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

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

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

  4. 点击构建设置

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

  6. 将值更改为Yes

  7. 搜索产品模块名称

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

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


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

#import "YourProjectName-Swift.h"

来自苹果网站的说明:

将 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 标头中使用它。 请注意,您不能在 Objective-C 中对 Swift 类进行子类化。

在此处输入图片说明

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

@import <FrameworkName>;

在此处输入图片说明

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

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

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

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

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

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

在此处输入图片说明

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

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

下面我的目标是KJExpandable ,所以它是KJExpandable-Swift.h
在此处输入图片说明

第一步:-

选择 Project Target -> Build Setting -> Search('Define') -> Define Module update value No to 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"

如果您将 Swift 代码导入同一框架内的Objective-C 文件,则需要注意一个问题 您必须通过指定框架名称和尖括号来完成:

#import <MyFramework/MyFramework-Swift.h>

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

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

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

在您尝试构建的目标的构建设置中搜索“Objective-C Generated Interface Header Name” (假设它是MyApp-Swift.h ),然后导入此设置的值( #import "MyApp-Swift.h" 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"

如果你想在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 类。

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

再做一项改变

  1. Xcode -> Project -> Target -> Build Settings -> Use Legacy Swift Language Version -> Yes

构建和运行。

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

破折号和下划线

#import <TargetName-Swift.h>

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

只有一些关于语法的提示,关于 Xcode 的一切都已经说了

  1. 您不能导入“纯”函数,只能导入类,即使标记为“公共”,因此:

    公共功能 f1(){ 打印 ("f1"); }

不会以任何方式调用。

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

  2. 如果它继承自 NSObject,如下所示:

    类实用程序:NSObject{

    static func aaa()->String{ return "AAA" }

    @objc static func bbb()->String{ return "BBB" }

    @objc private static func ccc()->String{ return "CCC" }

    }

在 OBJC 中:

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

bbb() 好的

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM