假设你现在就是一个iOS程序员,你对Objective-C很熟悉,对iOS开发也很熟悉,然而,苹果公司在iOS 8之后推出了Swift语言。那么,如何才能快速地从Objective-C过渡到Swift呢?

本章我们将重点讲解如何从Objective-C过渡到Swift,如何利用现有的Objective-C工程调用Swift代码,以及如何利用Swift工程调用以前写好的Objective-C代码。

1.1 选择语言

在苹果公司的Swift语言出现之前,开发iOS或Mac OS X应用主要使用Objective-C语言,此外还可以使用C和C++语言,但是UI部分只能使用Objective-C语言。

Swift语言出现后,iOS程序员有了更多的选择。在苹果社区里,有很多人在讨论Swift语言以及Objective-C语言的未来,人们关注的重点 是Swift语言是否能够完全取代Objective-C语言。然而在我看来,苹果公司为了给程序员提供更多的选择,会让这两种语言并存。既然是并存,我 们就有4种方式可以选择:

  • 采用纯Swift的改革派方式;

  • 采用纯Objective-C的保守派方式;

  • 采用Swift调用Objective-C的右倾改良派方式;

  • 采用Objective-C调用Swift的左倾改良派方式。

本书一直在介绍纯Swift的方式,而纯Objective-C的方式超出了本书的范围,后两种方式是本章的重点,无论是Swift调用Objective-C,还是Objective-C调用Swift,我们都需要做一些工作。

1.2 Swift调用Objective-C

Swift调用Objective-C需要一个名为“<工程名>-Bridging-Header.h”的桥接头文件,如图1-1所示。桥接头文件的作用是为Swift调用Objective-C对象搭建一个桥,它的命名必须是“<工程名>- Bridging-Header.h”,我们需要在桥接头文件中引入Objective-C头文件,而且桥接头文件是需要管理和维护的。

图 1-1 Swift调用Objective-C与桥接头文件

1.2.1 创建Swift工程

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

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

图 1-2 选择工程模板

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

图 1-3 新工程中的选项

我们可以按照提示并结合自己的实际情况和需要输入相关内容。下面简要说明一下图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”按钮,出现如图1-4所示的界面。

图 1-4 新创建的工程

在左边的导航栏中打开main.swift文件,会看到如图1-5所示的代码界面,我们可以在这里编写Swift代码。

图 1-5 代码界面

1.2.2 在Swift工程中添加Objective-C类

我们刚刚创建了Swift的工程,还需要调用其他Objective-C类来实现某些功能,需要添加Objective-C类到Swift工程中。具体过 程是,右键选择HelloWorld组,然后选择菜单中的“New File…”弹出新建文件模板对话框,如图1-6所示,选择“OS X→Source→Cocoa Class”。

图 1-6 新建文件模板

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

图 1-7 新建Objective-C类

相关选项设置完成后,单击“Next”按钮,进入保存文件界面,根据提示选择存放文件的位置,然后单击“Create”按钮创建Objective-C 类。如果是第一次创建Objective-C类,那么保存完成的时候,Xcode会提示我们是否添加桥接头文件,如图1-8所示,弹出一个对话框,我们应 该选择“Yes”,之后会在工程中创建桥接头文件HelloWorld-Bridging-Header.h。

图 1-8 创建桥接头文件

1.2.3 调用代码

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框架的头文件。第②行代码定义类NSObject父类。sayHello: withName:,它有两个参数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头文件,第②行代码定义 下面我们再来看看Swift调用文件main.swift的代码:

import Foundation                                                ①

varobj : ObjCObject = ObjCObject()                               ②
var hello = obj.sayHello("Good morning", withName:"Tony") ③ println(hello) ④

上述代码第①行的#import <Foundation/Foundation.h>语句,关于Foundation框架我们会在下一章介绍。

第②行代码声明并实例化objObjCObject

第③行代码调用sayHello: withName:方法。要注意Swift调用时的方法名和参数与Objective-C中该方法的方法名和参数的对应关系,如图1-9所示。

图 1-9 Objective-C与Swift调用方法和参数对应关系

第④行代码打印输出结果,输出结果如下:

Hi,Tony Good morning.

要使Swift能够调用Objective-C,还必须在桥接头文件中引入Objective-C头文件。HelloWorld- Bridging-Header.h代码如下:

#import "ObjCObject.h"

很简单,只有一行代码,如果还有其他的Objective-C头文件,都需要在此引入。

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

至此,整个工程创建完毕。如图1-10所示,点击左上角的“运行”按钮即可查看运行结果。

图 1-10 运行示例

1.3 Objective-C调用Swift

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

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

图 1-11 Objective-C调用Swift与Xcode生成头文件

1.3.1 创建Objective-C工程

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

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

图 1-12 选择工程模板

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

图 1-13 新工程中的选项

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

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

图 1-14 新建的Objective-C工程

1.3.2 在Objective-C工程中添加Swift类

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

图 1-15 新建文件模板

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

图 1-16 新建Swift类

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

1.3.3 调用代码

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

SwiftObject.swift代码如下:

import Foundation                                                         ①

@objc class SwiftObject: NSObject {                                       ②

Func sayHello(greeting : String, withName name : String) -> String {      ③

var string = "Hi," + name
string += greeting return string;
}
}

上述代码第①行引入了Foundation框架的头文件。第②行代码定义SwiftObject类继承自@objc@objc还可以修饰属性。

第③行代码定义了withName 下面看Objective-C端的代码,main.m文件代码如下:

#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是Swift中定义的类。第③行代码调用sayHello方法,它在Objective-C中被调用时的方法和参数命名与

图 1-17 Swift与Objective-C调用方法和参数对应关系

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

原文地址:http://www.ituring.com.cn/tupubarticle/2687

Swift和Objective-C混合编程的更多相关文章

  1. Swift 与 C 语言混合编程

    前言 作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 1.基本 ...

  2. Qt for iOS,Qt 与Objective C混合编程

    项目设置 既然要聊 Qt 混合 OC 编程,首先要简单介绍一下 Objective C .我只有一句话:Go,问搜索引擎去.因为我所知实在有限,怕误导了您.当然如果您不怕,往下看吧. OC源文件介绍 ...

  3. 《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射

    原创文章,欢迎转载.转载请注明:关东升的博客 如果引入必要的头文件,在Objective-C语言中可以使用C数据类型.而在Swift语言中是不能直接使用C数据类型,苹果公司为Swift语言提供与C语言 ...

  4. 《从零開始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射

    原创文章.欢迎转载.转载请注明:关东升的博客 posted @ 2017-07-21 13:23 zhchoutai 阅读(...) 评论(...) 编辑 收藏

  5. Objective-C与Swift的混合编程

    Swift 被设计用来无缝兼容 Cocoa 和 Objective-C .在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objecti ...

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

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

  7. swift 与 OC 混合编程

    原文地址:http://www.cocoachina.com/swift/20150608/12025.html 一.解决问题 Swift项目需要使用封装好的Objective-c组件.第三方类库,苹 ...

  8. Objective-C:swift、objective-c、C++、C混合编程

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  9. Swift 与 Objective-C混合编程

    在Swift项目中想要同一时候加入Objective-C的库支持或者须要同一时候用Objective-C编程 在加入新的文件时选择Objective-C系统就会自己主动生成一个xx-Bridging- ...

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

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

随机推荐

  1. opengl笔记

    GL_ARRAY_BUFFER(表示顶点数据) GL_ELEMENT_ARRAY_BUFFER(表示索引数据) GL_PIXEL_UNPACK_BUFEER( 表示传递给O p e n G L 的像素 ...

  2. Robot Framework中DatabaseLibrary应用

    DatabaseLibrary: 在RF的官网上,有DatabaseLibrary的下载链接,DatabaseLibrary有2个版本,Python和Java版.本人使用的是Python版本. 1.下 ...

  3. junwong 9个杀手级 JVM 编程语言

    http://www.oschina.net/question/213217_45561

  4. CC++初学者编程教程(1) Visual Stduio2010开发环境搭建

    Visual Studio是微软公司推出的开发环境.是目前最流行的Windows平台应用程序开发环境. Visual Studio 2010版本于2010年4月12日上市,其集成开发环境(IDE)的界 ...

  5. Java程序员快速入门Go语言

    这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...

  6. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(六)

    目的: 1. 为我们自己的watchdog写一个驱动 步骤: 通过之前的介绍,我们很容易猜想到写我们基于PCI的watchdog驱动,可以分2个步骤. 1. 探测加载PCI设备 这部分代码跟我们的设备 ...

  7. [有用命令]Linux 用户,用户组

    更改文件拥有者 -R 是递归的意思 chown [ -R ] root.work test 将test 文件 改为 拥有者 root , 用户组 work. chown [ -R ] work tes ...

  8. SQL Server索引进阶第十一篇:索引碎片分析与解决

    相关有关索引碎片的问题,大家应该是听过不少,也许也很多的朋友已经做了与之相关的工作.那我们今天就来看看这个问题. 为了更好的说明这个问题,我们首先来普及一些背景知识. 知识普及 我们都知道,数据库中的 ...

  9. SQL学习之高级数据过滤

    一.高级数据过滤之IN操作符 IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配.IN取一组由逗号分隔.括在圆括号中的合法值.代码如下: select ItemId,ItemName,Che ...

  10. SQL Server JDBC驱动中sqljdbc和sqljdbc4区别

    为了支持向后兼容以及可能的升级方案,JDBC Driver 2.0 在每个安装包中都包括 2 个 JAR 类库:sqljdbc.jar 和 sqljdbc4.jar. qljdbc.jar 类库提供对 ...