Swift调用Objective-C
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调用Objective C的FrameWork
很多Github的库经过很多年的发展,源码都是OC写的,,所以,用Swift调用OC的库就是开发中难免遇到的的一个问题,本文以AFNetworking为例,讲解如何跨语言调用. 第一步 创建一个空的工 ...
- IOS-Swift、Objective-C、C++混合编程
1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...
- ios开发——实用技术篇Swift&Swift调用C、C++、Object
Swift调用C.C++.Object 1.Swift调用C语言a,首先在项目中添加 CFile 文件命名为CHello,同时产生桥梁文件. b,创建之后的项目结构 b,在CHello.h文件中编写接 ...
- swift调用相机和相册
简单实现swift调用相机和相册的功能,分享代码与学习swift的童鞋共同进步 import UIKit class ViewController: UIViewController,UIImageP ...
- Swift调用Objective-C编写的代码(颜色选择器KKColorListPicker调用)
在Swift项目中,我们可以导入任意用Objective-C写的框架,代码库等.下面以Swift调用Objective-C编写的颜色选择器KKColorListPicker为例. 效果图如下: ...
- iOS开发笔记(Swift)-针对Swift调用PPiFlatSegmentedControl项目的一些修改
PPiFlatSegmentedControl项目是一个很流行的开源iOS控件库,提供了扁平化风格(Flat style)的SegmentedControl,可以自定义segment的颜色,图标.大小 ...
- Swift调用OC和C
Swift文件:main.swift import Foundation //Swift调用C函数 desc1() //Swift调用OC //拿到OC类 var funcClass = Root() ...
- Swift和Objective-C混合编程——Swift调用OC
在iOS应用的开发中.Swift必将代替OC,两者的趋势是"短期共存,长期代替".但曾经有太多的代码是用OC语言完毕的,而Swift的开发也从 OC中继承了非常多的特性.两者也是有 ...
- swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者
Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...
随机推荐
- Java学习备忘录
1.工程名首字母可以小写,类名首字母大写 2.批量注释: Eclipse : ctrl+/ 如果不行 用 ctrl+7 或者 ctrl+shift+c Notepad++ : ctrl+q 或者 c ...
- JQuery ajax请求一直返回Error(parsererror)
$.ajax({ type :"post", url :"busine_in.action", timeout : 40000, data: "cen ...
- 解决VS2012新建MVC4等项目时,收到加载程序集“NuGet.VisualStudio.Interop…”的错误
初装V2012,新建MVC4新项目时出现以下错误: 解决方法为: 通过VS2012的“工具-扩展和更新-联机”安装“NuGet Package Manager”扩展包,可以顺利新建MVC4项目啦!
- C#传递参数到线程的n个方法
[转]http://kb.cnblogs.com/a/888688/ 本片文章的议题是有关于传递参数到线程的几种方法. 首先我们要知道什么是线程,什么时候要用到线程,如何去使用线程,如何更好的利用线程 ...
- Android短信彩信收发流程(应用层)
下图为ComposeMessageActivity中confirmSendMessageIfNeeded部分的信息发送流程.主要以接收者有效性的确认为主,然后转向sendMessage方法进行发送. ...
- Java I/O输入输出流详解
一.文件的编码 开发时一定要注意项目默认的编码!!!!!!!! 文件操作的时候一定要记得关闭!!!!!!!! ASCII:美国标准 ...
- mysql 5.6 binlog组提交1
[MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程 尽管Mariadb以及Facebook在long long time ago就fix掉了这个臭名昭著的 ...
- rabbitmq——用户管理
安装最新版本的rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败. 翻看官方的release文档后,得知由于账号gues ...
- do {...} while (0) in macros
If you are a C programmer, you must be familiar with macros. They are powerful and can help you ease ...
- Asp.Net 之 调用分享接口
一.后台分享方式 腾讯QQ.腾讯空间.腾讯微博.新浪微博分享接口,如下: 注意:在网站对接前,请先申请注册好您的QQ登录appid.新浪登录Appkey.腾讯微博appkey. //腾讯QQ分享 ht ...