Objective-C调用Swift

摘要:
如果你有一个旧的iOS应用程序,它是使用Objective-C编写的,并且它的一些新函数需要使用Swift编写,你可以从Objective-C调用Swift。当Objective-C调用Swift时,它不需要桥头文件,而是需要Xcode生成的头文件。如下图所示,它可以向Objective-C公开Swift中的类。其名称为:-swift h将Swift类添加到Objective-C项目中。我们刚刚创建了Objective-C项目。我们需要将Swift类添加到项目中。行中的代码③ 调用SwiftObject的sayHello方法。在Objective-C中调用方法和参数命名与SwiftObject的方法和参数的对应关系如下图所示。

如果已经有了一个老的iOS应用,它是使用Objective-C编写的,而它的一些新功能需要采用Swift来编写,这时就可以从Objective-C调用Swift。

Objective-C调用Swift时不需要桥接头文件,而是需要Xcode生成的头文件。这种文件由Xcode生成,不需要我们维护,对于开发人员也是不可见的。如下图所示,它能够将Swift中的类暴露给Objective-C,它的命名是:<工程名>-swift.h。我们需要将该头文件引入到Objective-C文件中,而且Swift中的类需要声明为@objc。

Objective-C调用Swift第1张

创建Objective-C工程

为了能够更好地介绍混合搭配调用,我们首先创建一个Objective-C工程。出于简单考虑,我们可以创建一个Mac OS X命令行工程。

启动Xcode 6,然后单击File→New→Project菜单,在打开的Choose atemplate for your new project界面中选择“OS X→Application→Command Line Tool”工程模板(如下图所示)。

Objective-C调用Swift第2张

接着单击“Next”按钮,随即出现如下图所示的界面。

Objective-C调用Swift第3张

在Product Name中输入“HelloWorld”,在Language中选择Objective-C,其他的项目可以结合自己的实际情况输入内容。相关的工程选项设置完成后,单击“Next”按钮,后面的步类似。

创建成功后的界面如下图所示,在左边的导航栏中生成了一个main.m文件。打开main.m文件,可以在右边的代码界面中看到它的代码,我们还可以在这里编写代码。

Objective-C调用Swift第4张

在Objective-C工程中添加Swift类

我们刚刚创建了Objective-C的工程,需要添加Swift类到工程中。具体过程是,右键选择HelloWorld组,选择菜单中的“New File…”弹出新建文件模板对话框。如下图所示,选择OS X→Source→Cocoa Class。

Objective-C调用Swift第5张

接着单击“Next”按钮,随即出现如图下所示的界面。在Class中输入“SwiftObject”,在Language中选择Swift,其他的选项保持默认值就可以了。

Objective-C调用Swift第6张

相关选项设置完成后,单击“Next”按钮,进入保存文件界面,根据提示选择存放文件的位置,然后单击“Create”按钮创建Swift类。如果工程中没有桥接头文件,在创建过程中,Xcode也会提示我们是否添加桥接头文件,可以选择不添加。

调用代码

Swift的SwiftObject创建完成后,我们会在Xcode工程中看到新增加的SwiftObject.swift文件。

SwiftObject.swift代码如下:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. import Foundation                                                               ①  
  2.    
  3. @objc class SwiftObject: NSObject {                     ②  
  4.    
  5. Func sayHello(greeting : String, withName name : String) ->String {      ③  
  6.    
  7. var string = "Hi," + name  
  8. string += greeting  
  9.    
  10. return string;  
  11.     }  
  12. }  

上述代码第①行引入了Foundation框架的头文件。第②行代码定义SwiftObject类,SwiftObject类继承自NSObject类。另外,我们在类前面声明为@objc,@objc所声明的类能够被Objective-C访问,@objc还可以修饰属性。

第③行代码定义了sayHello方法,它有两个参数,第一个参数不需要指定外部参数名,第二个参数(除了第一个以后所有的参数)需要指定外部参数名,例如withName是name参数的外部参数名。这是为了方便在Objective-C中调用。

下面看Objective-C端的代码,main.m文件代码如下:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. #import <Foundation/Foundation.h>  
  2. #import "HelloWorld-swift.h"                            ①  
  3.    
  4. int main(intargc, const char * argv[]) {  
  5.    
  6. SwiftObject *sobj = [[SwiftObjectalloc] init];          ②  
  7. NSString *hello = [sobjsayHello:@"Good morning"withName:@"Tony"];        ③  
  8.    
  9. NSLog(@"%@",hello);                                                         ④  
  10.    
  11. return 0;  
  12. }  

 上述代码第①行引入头文件HelloWorld-swift.h,它是Objective-C调用Swift对象所必需的,它的命名规则是“<工程名>-swift.h”。

第②行代码实例化SwiftObject对象,SwiftObject是Swift中定义的类。第③行代码调用SwiftObject的sayHello方法,它在Objective-C中被调用时的方法和参数命名与SwiftObject的方法和参数之间的对应关系如下图所示。

 Objective-C调用Swift第11张

第④行代码NSLog(@"%@",hello)用于输出结果,输出结果如下:

2014-07-05 14:25:43.879HelloWorld[3266:303] Hi,TonyGood morning

这样就实现了在Objective-C中调用Swift代码,我们可以借助于这样的调用充分利用已有的Swift文件,减少重复编写代码,提高工作效率。

更多内容请关注国内第一本Swift图书《Swift开发指南》
本书交流讨论网站:http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

欢迎关注智捷iOS课堂微信公共平台

Objective-C调用Swift第12张

免责声明:文章转载自《Objective-C调用Swift》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Repository总结让你的拼图聪明起来——自动还原拼图下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

孤荷凌寒自学python第十三天python代码的外部模块引用与基本赋值语句

孤荷凌寒自学python第十三天python代码的外部模块引用与基本赋值语句   (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 从结构化编程流行以来,代码便被分块存储,称之为模块或库。 在python中仍然如其它编程语言一样,我们可以在一个文档中方便地引用一个模块,然后可以在当前文档的代码中使用外部模块的可用对象。 一般来说,在python中一个...

windows环境下为php打开ssh2扩展

安装步骤 1. 下载 php extension ssh2下载地址http://windows.php.net/downloads/pecl/releases/ssh2/0.12/ 根据自己PHP的版本去下载,我使用的是线程安全的,所以下载的是php_ssh2-0.12-5.4-ts-vc9-x86.zip 注意:ts是线程安全的,nts是线程不安全的,...

解决fiddler开启后打开浏览器提示无法访问网络

在使用python接口测试过程中常用jupyter调试python代码,因为jupyter默认代理端口是8888,开启后又打开fiddler抓包 打开浏览器提示‘无法访问网络’ 这个问题主要是端口冲突导致了 可以在tools-options-connections中修改端口号(默认为8888) 修改后点击ok重启fiddler即可...

[转]“在CMD下面执行命令需要加上exe后缀才能执行“的解决方案

在装完Python(x,y)后,在CMD中执行 python 命令结果显示没有找到命令。 Google了一下,没有找到相应的解决方案,但是竟然用Baidu到了,额。。是说系统环境变量中的 PATHEXT 项没有.EXE,但是我的系统环境变量中的PATHEXT中有.EXE的啊,突然看到旁边的用户环境变量中也有PATHEXT,但是其中没有.EXE项,哈哈,...

利用python制作在线视频播放器遇到的一些问题

经过前期的调研,我准备使用PyQT+PyAV+PyAudio+pillow。期间也尝试过使用ffmpeg-python,但最后还是选择了av这个更底层,自由度更大的库来完成音视频的处理。   ======================== 问题1,win= QWidget()执行为什么会失败 答案: 在此之前,先要执行mapp = QApplicatio...

怒肝半月!Python 学习路线+资源大汇总

Python 学习路线 by 鱼皮。 原创不易,请勿抄袭,违者必究! 大家好,我是鱼皮,肝了十天左右的 Python 学习路线终于来了~ 和之前一样,在看路线前,建议大家先通过以下视频了解几个问题: Python 为什么这么火? 为什么都在说学 Python 找不到工作?Python 真香么? 我要学 Python 么? 怎么快速学习? 视频地址:...