如何从Swift调用Objective-C代码:iOS中的语言协作

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Objective-C和Swift:两个世界,一个项目

\n\n

您用Swift编写代码,但手头有一个用Objective-C编写的库,或者一段老旧但可靠的ObjC代码。熟悉的情况吗?别担心:Apple为这两种语言的协作提供了一个出色的机制。在本文中,我们将探讨如何从Swift调用Objective-C代码——快速、简单且毫无烦恼。

\n\n

这个问题是Stack Overflow上最热门的问题之一(数千次浏览和数百次点赞)。这并非没有道理:能够将Objective-C集成到Swift中,意味着您可以访问iOS发展数十年来积累的庞大库和代码遗产。让我们最终弄清楚这是如何工作的。

\n\n

什么是Bridging Header,为什么需要它?

\n\n

Swift和Objective-C协作的秘诀是一个名为Bridging Header(桥接头文件)的特殊文件。它就像一个翻译器:告诉Swift哪些Objective-C类和函数可用,以及如何正确调用它们。

\n\n

当您创建桥接文件时,编译器会自动拾取它,并使Objective-C中的所有声明在Swift中可见。您只需将ObjC的头文件导入到这个文件中——就完成了。

\n\n

如何在Xcode中创建Bridging Header

\n\n

最简单的方法是让Xcode为您完成。只需向项目中添加一个新的Objective-C文件(File → New → File → Objective-C File)。Xcode会询问:“您想创建Bridging Header吗?”——回答“是”。之后,项目中会出现一个名为YourProjectName-Bridging-Header.h的文件。

\n\n

如果您已经在处理一个项目,并希望手动添加桥接,请按以下步骤操作:

\n\n
    \n
  • 创建一个新的头文件(File → New → File → Header File),并将其命名为,例如,MyProject-Bridging-Header.h。
  • \n
  • 在项目设置(Build Settings)中找到Objective-C Bridging Header参数,并指定您的文件路径。
  • \n
\n\n

完成。现在,您在此文件中编写的所有内容都将在Swift中可用。

\n\n

编写Objective-C类并将其连接到Swift

\n\n

让我们创建一个简单的Objective-C类,用于向用户问好。首先是头文件(Greeter.h):

\n\n
// Greeter.h\n#import <Foundation/Foundation.h>\n\n@interface Greeter : NSObject\n\n- (NSString *)greetWithName:(NSString *)name;\n\n@end\n
\n\n

然后是实现文件(Greeter.m):

\n\n
// Greeter.m\n#import "Greeter.h"\n\n@implementation Greeter\n\n- (NSString *)greetWithName:(NSString *)name {\n    return [NSString stringWithFormat:@"你好,%@!很高兴认识你。", name];\n}\n\n@end\n
\n\n

现在是最重要的一步。打开您的Bridging Header(例如,MyProject-Bridging-Header.h)并添加以下内容:

\n\n
// MyProject-Bridging-Header.h\n#import "Greeter.h"\n
\n\n

搞定!现在您可以在Swift中使用Greeter类,就像它是用Swift编写的一样:

\n\n
// ViewController.swift\nimport UIKit\n\nclass ViewController: UIViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        let greeter = Greeter()\n        let message = greeter.greet(withName: "阿列克谢")\n        print(message) // 输出:"你好,阿列克谢!很高兴认识你。"\n    }\n}\n
\n\n

请注意:方法greetWithName:在Swift中转换为greet(withName:)。这是Objective-C方法名称到Swift风格的自动适配。

\n\n

使用Objective-C框架和库

\n\n

通常,您需要集成的不是自己的代码,而是一个现成的Objective-C库(例如,旧版本的AFNetworking或CocoaLumberjack)。这里甚至更简单:

\n\n
    \n
  • 通过CocoaPods、Carthage或SPM安装该库。
  • \n
  • 将其头文件导入到您的Bridging Header中。
  • \n
  • 使用
  • \n

博客

书籍推荐