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文件,减少重复编写代码,提供工作效率。
至此,整个工程创建完毕。如图所示,点击左上角的“运行”按钮 即可查看运行结果。
 

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

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

Swift调用Objective-C的更多相关文章

  1. Swift调用Objective C的FrameWork

    很多Github的库经过很多年的发展,源码都是OC写的,,所以,用Swift调用OC的库就是开发中难免遇到的的一个问题,本文以AFNetworking为例,讲解如何跨语言调用. 第一步 创建一个空的工 ...

  2. IOS-Swift、Objective-C、C++混合编程

    1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...

  3. ios开发——实用技术篇Swift&Swift调用C、C++、Object

    Swift调用C.C++.Object 1.Swift调用C语言a,首先在项目中添加 CFile 文件命名为CHello,同时产生桥梁文件. b,创建之后的项目结构 b,在CHello.h文件中编写接 ...

  4. swift调用相机和相册

    简单实现swift调用相机和相册的功能,分享代码与学习swift的童鞋共同进步 import UIKit class ViewController: UIViewController,UIImageP ...

  5. Swift调用Objective-C编写的代码(颜色选择器KKColorListPicker调用)

    在Swift项目中,我们可以导入任意用Objective-C写的框架,代码库等.下面以Swift调用Objective-C编写的颜色选择器KKColorListPicker为例. 效果图如下:     ...

  6. iOS开发笔记(Swift)-针对Swift调用PPiFlatSegmentedControl项目的一些修改

    PPiFlatSegmentedControl项目是一个很流行的开源iOS控件库,提供了扁平化风格(Flat style)的SegmentedControl,可以自定义segment的颜色,图标.大小 ...

  7. Swift调用OC和C

    Swift文件:main.swift import Foundation //Swift调用C函数 desc1() //Swift调用OC //拿到OC类 var funcClass = Root() ...

  8. Swift和Objective-C混合编程——Swift调用OC

    在iOS应用的开发中.Swift必将代替OC,两者的趋势是"短期共存,长期代替".但曾经有太多的代码是用OC语言完毕的,而Swift的开发也从 OC中继承了非常多的特性.两者也是有 ...

  9. swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者

    Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...

随机推荐

  1. 通过SCVMM分配SMB 3.0 文件共享

    1.创建SMB群集共享,赋予Hyper-V主机. Hyper-V群集名称.Hyper-V管理员.Hyper-V服务账户完全控制权限 2.VMM提供程序导入 文件服务器(运行方式账户要对文件服务器群集的 ...

  2. leetcode第一刷_Count and Say

    水题. 描写叙述的还挺麻烦的,实际上就是纸老虎,用两个string,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符增加到这一轮的字符串中就 ...

  3. bat 简单命令实现编译cocos2d-x android项目

    新建一个compile_cmd.bat文件,存放需要执行的命令: cocos compile -p android -j 4 然后,如果直接运行这个文件,在编译完之后命令行窗口会自动退出,这样我们无法 ...

  4. [Angular 2] How To Debug An Angular 2 Application - Debugging via Augury or the Console

    In this lesson we will learn several ways to debug an Angular 2 application, including by using Augu ...

  5. springMVC中的Controller里面定义全局变量

    转自:http://notebookdong.iteye.com/blog/1869852 使用SpringMVC的时候,如果想要在Controller中定义一个全局变量,并且实现在不同用户访问程序的 ...

  6. memcache 存储session

    php使用memcache存储session   http://blog.csdn.net/weilee2009/article/details/7658260

  7. java 开源缓存框架--转载

    原文地址:http://www.open-open.com/13.htm  JBossCache/TreeCache  JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的 ...

  8. Computer skills one can learn within one day

    Computer related technical skills are usually thought as complicated and difficult to understand. It ...

  9. org.apache.hadoop.fs-ChecksumException

    当ChecksumFileSystem出现问题时抛出 package org.apache.hadoop.fs; import java.io.IOException; /** Thrown for ...

  10. setting bundle 多语言,本地化,系统设置

    新建一个setting.bundle后结构如下: Settings.bundle en.lproj Root.strings Root.plist 大家一般都在Root.plst里面添加删除条目,那么 ...