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\nSwift和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
- 创建一个新的头文件(File → New → File → Header File),并将其命名为,例如,
MyProject-Bridging-Header.h。 \n - 在项目设置(Build Settings)中找到Objective-C Bridging Header参数,并指定您的文件路径。 \n
完成。现在,您在此文件中编写的所有内容都将在Swift中可用。
\n\n编写Objective-C类并将其连接到Swift
\n\n让我们创建一个简单的Objective-C类,用于向用户问好。首先是头文件(Greeter.h):
// 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):
// 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)并添加以下内容:
// MyProject-Bridging-Header.h\n#import "Greeter.h"\n\n\n搞定!现在您可以在Swift中使用Greeter类,就像它是用Swift编写的一样:
// 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风格的自动适配。
使用Objective-C框架和库
\n\n通常,您需要集成的不是自己的代码,而是一个现成的Objective-C库(例如,旧版本的AFNetworking或CocoaLumberjack)。这里甚至更简单:
\n\n- \n
- 通过CocoaPods、Carthage或SPM安装该库。 \n
- 将其头文件导入到您的Bridging Header中。 \n
- 使用 \n