Objective-C调用Swift

若是已经有了一个老的iOS应用,它是使用Objective-C编写的,而它的一些新功能须要采用Swift来编写,这时就能够从Objective-C调用Swift。php

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

建立Objective-C工程swift

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

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

 

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

 

在Product Name中输入“HelloWorld”,在Language中选择Objective-C,其余的项目能够结合本身的实际状况输入内容。相关的工程选项设置完成后,单击“Next”按钮,后面的步相似。spa

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

 

在Objective-C工程中添加Swift类命令行

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

 

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

 

相关选项设置完成后,单击“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的方法和参数之间的对应关系以下图所示。

 

 

第④行代码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课堂微信公共平台

相关文章
相关标签/搜索