Objective-C里调用Swift
2016-03-22 15:00
429 查看
如果已经有了一个老的iOS应用,它是使用Objective-C编写的,而它的一些新功能需要采用Swift来编写,这时就可以从Objective-C调用Swift。
Objective-C调用Swift时不需要桥接头文件,而是需要Xcode生成的头文件。这种文件由Xcode生成,不需要我们维护,对于开发人员也是不可见的。如下图所示,它能够将Swift中的类暴露给Objective-C,它的命名是:<工程名>-swift.h。我们需要将该头文件引入到Objective-C文件中,而且Swift中的类需要声明为@objc。
![](http://img.blog.csdn.net/20140817165515429)
创建Objective-C工程
为了能够更好地介绍混合搭配调用,我们首先创建一个Objective-C工程。出于简单考虑,我们可以创建一个Mac OS X命令行工程。
启动Xcode 6,然后单击File→New→Project菜单,在打开的Choose atemplate for your new project界面中选择“OS X→Application→Command Line Tool”工程模板(如下图所示)。
![](http://img.blog.csdn.net/20140817165531871)
接着单击“Next”按钮,随即出现如下图所示的界面。
![](http://img.blog.csdn.net/20140817165545256)
在Product Name中输入“HelloWorld”,在Language中选择Objective-C,其他的项目可以结合自己的实际情况输入内容。相关的工程选项设置完成后,单击“Next”按钮,后面的步类似。
创建成功后的界面如下图所示,在左边的导航栏中生成了一个main.m文件。打开main.m文件,可以在右边的代码界面中看到它的代码,我们还可以在这里编写代码。
![](http://img.blog.csdn.net/20140817165643959)
在Objective-C工程中添加Swift类
我们刚刚创建了Objective-C的工程,需要添加Swift类到工程中。具体过程是,右键选择HelloWorld组,选择菜单中的“New File…”弹出新建文件模板对话框。如下图所示,选择OS X→Source→Cocoa Class。
![](http://img.blog.csdn.net/20140817165659200)
接着单击“Next”按钮,随即出现如图下所示的界面。在Class中输入“SwiftObject”,在Language中选择Swift,其他的选项保持默认值就可以了。
![](http://img.blog.csdn.net/20140817165715502)
相关选项设置完成后,单击“Next”按钮,进入保存文件界面,根据提示选择存放文件的位置,然后单击“Create”按钮创建Swift类。如果工程中没有桥接头文件,在创建过程中,Xcode也会提示我们是否添加桥接头文件,可以选择不添加。
调用代码
Swift的SwiftObject创建完成后,我们会在Xcode工程中看到新增加的SwiftObject.swift文件。
SwiftObject.swift代码如下:
[html] view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
import Foundation ①
@objc class SwiftObject: NSObject { ②
Func sayHello(greeting : String, withName name : String) ->String { ③
var string = "Hi," + name
string += greeting
return string;
}
}
上述代码第①行引入了Foundation框架的头文件。第②行代码定义SwiftObject类,SwiftObject类继承自NSObject类。另外,我们在类前面声明为@objc,@objc所声明的类能够被Objective-C访问,@objc还可以修饰属性。
第③行代码定义了sayHello方法,它有两个参数,第一个参数不需要指定外部参数名,第二个参数(除了第一个以后所有的参数)需要指定外部参数名,例如withName是name参数的外部参数名。这是为了方便在Objective-C中调用。
下面看Objective-C端的代码,main.m文件代码如下:
[html] view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
#import <Foundation/Foundation.h>
#import "HelloWorld-swift.h" ①
int main(intargc, const char * argv[]) {
SwiftObject *sobj = [[SwiftObjectalloc] init]; ②
NSString *hello = [sobjsayHello:@"Good morning"withName:@"Tony"]; ③
NSLog(@"%@",hello); ④
return 0;
}
上述代码第①行引入头文件HelloWorld-swift.h,它是Objective-C调用Swift对象所必需的,它的命名规则是“<工程名>-swift.h”。
第②行代码实例化SwiftObject对象,SwiftObject是Swift中定义的类。第③行代码调用SwiftObject的sayHello方法,它在Objective-C中被调用时的方法和参数命名与SwiftObject的方法和参数之间的对应关系如下图所示。
![](http://img.blog.csdn.net/20140817165540312)
第④行代码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
Objective-C调用Swift时不需要桥接头文件,而是需要Xcode生成的头文件。这种文件由Xcode生成,不需要我们维护,对于开发人员也是不可见的。如下图所示,它能够将Swift中的类暴露给Objective-C,它的命名是:<工程名>-swift.h。我们需要将该头文件引入到Objective-C文件中,而且Swift中的类需要声明为@objc。
创建Objective-C工程
为了能够更好地介绍混合搭配调用,我们首先创建一个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”按钮,后面的步类似。
创建成功后的界面如下图所示,在左边的导航栏中生成了一个main.m文件。打开main.m文件,可以在右边的代码界面中看到它的代码,我们还可以在这里编写代码。
在Objective-C工程中添加Swift类
我们刚刚创建了Objective-C的工程,需要添加Swift类到工程中。具体过程是,右键选择HelloWorld组,选择菜单中的“New File…”弹出新建文件模板对话框。如下图所示,选择OS X→Source→Cocoa Class。
接着单击“Next”按钮,随即出现如图下所示的界面。在Class中输入“SwiftObject”,在Language中选择Swift,其他的选项保持默认值就可以了。
相关选项设置完成后,单击“Next”按钮,进入保存文件界面,根据提示选择存放文件的位置,然后单击“Create”按钮创建Swift类。如果工程中没有桥接头文件,在创建过程中,Xcode也会提示我们是否添加桥接头文件,可以选择不添加。
调用代码
Swift的SwiftObject创建完成后,我们会在Xcode工程中看到新增加的SwiftObject.swift文件。
SwiftObject.swift代码如下:
[html] view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
import Foundation ①
@objc class SwiftObject: NSObject { ②
Func sayHello(greeting : String, withName name : String) ->String { ③
var string = "Hi," + name
string += greeting
return string;
}
}
上述代码第①行引入了Foundation框架的头文件。第②行代码定义SwiftObject类,SwiftObject类继承自NSObject类。另外,我们在类前面声明为@objc,@objc所声明的类能够被Objective-C访问,@objc还可以修饰属性。
第③行代码定义了sayHello方法,它有两个参数,第一个参数不需要指定外部参数名,第二个参数(除了第一个以后所有的参数)需要指定外部参数名,例如withName是name参数的外部参数名。这是为了方便在Objective-C中调用。
下面看Objective-C端的代码,main.m文件代码如下:
[html] view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
#import <Foundation/Foundation.h>
#import "HelloWorld-swift.h" ①
int main(intargc, const char * argv[]) {
SwiftObject *sobj = [[SwiftObjectalloc] init]; ②
NSString *hello = [sobjsayHello:@"Good morning"withName:@"Tony"]; ③
NSLog(@"%@",hello); ④
return 0;
}
上述代码第①行引入头文件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
相关文章推荐
- 谈Objective-C block的实现
- Objective-C Runtime 运行时之四:Method Swizzling
- ES2015 - Object (6)
- iOS 原生二维码扫描crush([AVCaptureMetadataOutput setMetadataObjectTypes:] - unsupported type found. Use -)
- 分享你最喜欢的技巧和提示(Xcode,Objective-C,Swift,C...等等)--推酷
- objective-c static 与 extern 的用法
- 此证书的签发者无效 解决办法,亲测操作一边,可用了
- Objective-C之run loop详解
- Objective-C中NSString与int和float的相互转换
- jsonobject 遍历 org.json.JSONObject
- Objective-C对象与Core Foundation对象
- Newtonsoft.Json之JArray, JObject, JProperty,JValue
- object-c第三方FMDB对sqlite使用
- object-c第三方FMDB对sqlite使用
- C++ 进阶——object slicing 与虚函数与dynamic_cast<>
- java综合之 链表 接口 Object对象
- Objective-C 在View中跳转页面
- Objective-C 继承新的认识以及作用
- objective-C CollectionView 加深(添加注册头部View)
- Objective-C探究alloc方法的实现