Swift调用Objective-C需要一个名为“<工程名>-Bridging-Header.h”的桥接头文件,如下图所示。桥接头文件的作用是为Swift调用Objective-C对象搭建一个桥,它的命名必须是“<工程名>- Bridging-Header.h”,我们需要在桥接头文件中引入Objective-C头文件,而且桥接头文件是需要管理和维护的。
创建Swift工程
为了能够更好地介绍混合搭配调用,我们首先创建一个Swift工程。出于简单考虑,我们可以创建一个Mac OS X命令行工程,而不是一个iOS工程。
启动Xcode 6,然后单击File→New→Project菜单,在打开的Choose a template for your new project界面中选择“OS X→Application→Command Line Tool”工程模板
接着单击“Next”按钮,随即出现如下图所示的界面。
我们可以按照提示并结合自己的实际情况和需要输入相关内容。下面简要说明一下图18-3中的工程选项。
Product Name:工程名。
Organization Name:组织名。
Organization Identifier:组织标识(很重要)。一般情况下,这里输入的是组织名或公司的域名(如net.cocoagame),类似于Java中的包命名。
Bundle Identifier:捆绑标识符(很重要)。该标识符由Product Name + Organization Identifier构成。因为在App Store上发布应用的时候会用到它,所以它的命名不可重复。
Language:开发语言选择。在这里我们可以选择开发应用所使用的语言,在Xcode 6中可以选择Swift和Objective-C。
相关工程选项设置完成后,单击“Next”按钮,进入下一级界面。根据提示选择存放文件的位置,然后单击“Create”按钮,出现如下图所示的界面。
在左边的导航栏中打开main.swift文件,会看到如下图所示的代码界面,我们可以在这里编写Swift代码。
在Swift工程中添加Objective-C类
我们刚刚创建了Swift的工程,还需要调用其他Objective-C类来实现某些功能,需要添加Objective-C类到Swift工程中。具体过程是,右键选择HelloWorld组,然后选择菜单中的“New File…”弹出新建文件模板对话框,如下图所示,选择“OS X→Source→Cocoa Class”。
接着单击“Next”按钮,随即出现如下图所示的界面。在Class中输入“ObjCObject”,在Language中选择Objective-C,其他的选项保持默认值就可以了。
相关选项设置完成后,单击“Next”按钮,进入保存文件界面,根据提示选择存放文件的位置,然后单击“Create”按钮创建Objective-C类。如果是第一次创建Objective-C类,那么保存完成的时候,Xcode会提示我们是否添加桥接头文件,如下图所示,弹出一个对话框,我们应该选择“Yes”,之后会在工程中创建桥接头文件HelloWorld-Bridging-Header.h。
调用代码
Objective-C的ObjCObject创建完成后,我们会在Xcode工程中看到新增加的两个文件ObjCObject.h和ObjCObject.m。本书并不打算过多地介绍Objective-C语言,但为了更好地理解Swift与Objective-C的互相调用,我们还是简单地解释一下Objective-C代码。
ObjCObject.h代码如下:
#import <Foundation/Foundation.h>①
@interface ObjCObject : NSObject②
-(NSString*)sayHello:(NSString*)greeting withName: (NSString*)name;③
@end
ObjCObject.h文件是Objective-C的头文件,我们在这里定义类,声明类的成员变量和方法。第①行代码引入Foundation框架的头文件。第②行代码定义类ObjCObject,它继承自NSObject父类。NSObject类是所有Objective-C的根类。第③行代码声明了实例方法sayHello: withName:,它有两个参数greeting和name。
ObjCObject.m代码如下:
#import "ObjCObject.h"①
@implementation ObjCObject
-(NSString*)sayHello:(NSString*)greeting withName: (NSString*)name②
{
NSString *string = [NSStringstringWithFormat:@"Hi,%@ %@.",name,greeting];
return string;
}
@end
上述代码第①行引入ObjCObject.h头文件,第②行代码定义sayHello: withName:方法。
下面我们再来看看Swift调用文件main.swift的代码:
import Foundation①
varobj : ObjCObject = ObjCObject()②
var hello = obj.sayHello("Good morning", withName:"Tony")③
println(hello)④
上述代码第①行的import Foundation语句是引入Foundation框架,类似于Objective-C的#import <Foundation/Foundation.h>语句,关于Foundation框架我们会在下一章介绍。
第②行代码声明并实例化ObjCObject类的实例obj。ObjCObject就是Objective-C里定义的ObjCObject。
第③行代码调用ObjCObject类的sayHello: withName:方法。要注意Swift调用时的方法名和参数与Objective-C中该方法的方法名和参数的对应关系,如下图所示。
第④行代码打印输出结果,输出结果如下:
Hi,Tony Good morning.
要使Swift能够调用Objective-C,还必须在桥接头文件中引入Objective-C头文件。HelloWorld- Bridging-Header.h代码如下:
#import "ObjCObject.h"
很简单,只有一行代码,如果还有其他的Objective-C头文件,都需要在此引入。
这样就实现了在Swift中调用Objective-C代码,我们可以借助于这样的调用充分地利用已有的Objective-C文件,减少重复编写代码,提供工作效率。
至此,整个工程创建完毕。如图所示,点击左上角的“运行”按钮 即可查看运行结果。
欢迎关注智捷iOS课堂微信公共平台
相关推荐
Swift可以调用Objective-C的方法,反之亦然。Swift类可以通过遵循`objc`协议来暴露给Objective-C,而Objective-C类可以通过Swift化的命名规则和协议实现Swift接口。 3. **协议(Protocol)**:在Swift中,协议是一...
- **语法差异**:Swift拥有更简洁、现代化的语法,而Objective-C则显得更为繁琐,例如方法调用使用`-`和`+`符号。 - **类型安全**:Swift是静态类型语言,强制类型检查,而Objective-C是动态类型语言,运行时确定...
这使得Objective-C代码可以轻松地调用Swift定义的方法和类。 #### 在App Target中进行语言代码导入 **Objective-C Bridging Header**用于让Swift代码能够访问Objective-C代码。要在同一目标中实现这一点,你需要...
Swift调用Objective-C代码是iOS开发中常见的场景,因为尽管Swift已经发布并逐渐成熟,但Objective-C积累了大量的库和框架,这些资源对于开发者来说是非常宝贵的。在Swift项目中调用Objective-C代码,可以让开发者...
总之,Swift调用Objective-C编写的API提供了强大的灵活性和兼容性,允许开发者在新项目中利用已有的Objective-C代码,同时享受Swift的现代特性和性能优势。通过理解和掌握这些互用性机制,开发者可以更有效地构建跨...
通过桥接头文件,开发者可以在Swift项目中调用Objective-C代码,反之亦然,使得过渡到Swift变得更加平滑。 在Swift开发中,`Zen Master`这一概念可能是指对Swift编程的精通程度,或者是一个特定的开发项目或教程的...
`Objective-C下的Flexbox MLLayout`可能是指一个Objective-C编写的库,名为MLLayout,该库实现了Flexbox布局模式,并且可以在Swift项目中通过桥接头文件(Bridge Header)进行调用。Molong(可能的作者或项目名)的...
Swift的设计旨在与现有的Cocoa和Objective-C代码无缝对接,这意味着开发者可以在Swift项目中调用Objective-C编写的API,反之亦然。这一特性极大地简化了迁移过程,并允许团队逐步将Objective-C项目过渡到Swift。 ##...
- 为了在 Swift 中使用 Objective-C 代码,苹果提供了桥接头文件(Bridge Header),使得两种语言可以相互调用对方的API。 - Objective-C 类和协议可以在 Swift 中直接使用,反之亦然,这为开发者提供了灵活性。 ...
3. Objective-C API的交互:文档讲述了在Swift代码中如何调用Objective-C的API,包括初始化、访问属性、调用方法、处理id兼容性问题以及nil值的使用。 4. Swift扩展和闭包:扩展是Swift中非常强大的特性,可以无需...
SwiftTrace 是一个强大的工具,专为Swift和Objective-C开发者设计,用于深度跟踪和分析方法调用。这个工具在iOS、macOS以及其他使用Swift或Objective-C的Apple平台开发中,可以帮助开发者进行性能优化、调试和理解...
2. **消息传递**:Objective-C中的消息传递是通过`objc_msgSend`函数实现的,需要在Swift中创建类似的消息调度系统来处理方法调用。 3. **动态性**:实现Swift中的动态类型和方法解析,允许在运行时添加、修改或查找...
Objective-C语法的基石是C语言的语法结构,这意味着所有的C语言代码都可以在Objective-C中直接使用。但是,Objective-C在C的基础上新增了消息传递机制,这是它与C语言的一个重要区别。在Objective-C中,方法调用是...
- **Objective-C选择器**:Swift可以通过选择器来动态调用Objective-C的方法。 - **编写具有Objective-C行为的Swift类**: - **继承Objective-C类**:Swift可以继承Objective-C定义的类。 - **实现协议**:Swift...
Objective-C是一种强大的面向对象编程语言,特别是在iOS和macOS...了解并熟练掌握Objective-C是成为苹果平台开发者的关键步骤,因为虽然Swift已经越来越流行,但Objective-C在很多现有的代码库和框架中仍然被广泛使用。
2、Objective-C类需要继承弹窗基类时必须选择该库的Objective-C版本中的基类; 3、两个库可以同时存在一个项目中,建议两个库同时使用。 ``` ## 温馨提示: ```温馨提示 1、同一窗口内目前只支持弹窗一个弹窗,...
4. **JavaScript调用Objective-C**: 在网页的JavaScript代码中,可以通过`window.webkit.messageHandlers.myHandler.postMessage(data)`来调用Objective-C的方法。其中"data"是传递给Objective-C的参数。 四、...
Objective-C是iOS开发中最主要的编程语言之一,在苹果推出Swift之前,几乎所有iOS应用程序都是用Objective-C编写的。虽然现在Swift已经成为苹果官方推荐的首选语言,但许多现有应用仍基于Objective-C编写,且该语言...
同时,Swift支持Objective-C的消息传递机制,使得两种语言之间的调用变得自然。 2. **类型安全**:Swift强调类型安全,这在与Objective-C交互时尤为重要。Swift会自动推断类型,但有时需要显式指定,以确保与其他...