swift 被设计用来无缝兼容 cocoa 和 objective-c 。在 swift 中,你可以使用 objective-c 的 api(包括系统框架和你自定义的代码),你也可以在 objective-c中 使用 swift 的 api。这种兼容性使 swift 变成了一个简单、方便并且强大的工具集成到你的 cocoa 应用开发工作流程中。
这篇指南包括了三个有关兼容性的重要方面方便你更好地利用来开发 cocoa 应用:
互用性 使你将 swift 和 objective-c 相接合,允许在 objective-c 中使用 swift 的 class 并且当你在写 swift 代码时利用熟悉的 cocoa class、pattern、practice。
混合和匹配 允许你创建结合了 swift 和 objective-c 文件的混合语言应用,他们能更彼此进行通信。
迁移 由于以上两点,从已经存在的 objective-c 代码迁移到 swift 是非常简单的,使得用最新的 swift 特性代替你的 objective-c 应用部分内容成为了可能。
在你开始学习这些特性前,你需要对如何建立 swift 环境来访问 cocoa 系统框架有个大体了解。
建立你的 swift 环境
为了开始体验在 swift 中访问 cocoa 框架,使用 xcode 的一个模板来创建一个基于 swift 应用。
在 xcode 中创建一个 swift 项目
1) 选择 file > new > project > (ios or os x) > application > your template of choice。
2) 点击 language 弹出菜单并选择 swift。
swift 项目的结构几乎和 objective-c 项目一模一样,只有一个重要的区别:swift 没有头文件。在实现和接口之间没有显示的划分,所以一个特定类中的所有信息都存储在单独的.swift文件中。
现在开始,你可以开始体验在app delegate中写 swift 代码,或者你可以通过选择 file > new > file > (ios or os x) > other > swift来创建一个 swift 类。
理解 swift 导入过程
在你建立 xcode 项目后,你可以在 swift 里导入任意用 objective-c 来工作的 cocoa 平台框架。
任意 objective-c 的框架(或 c 类库)将作为一个module,能直接导入到 swift 中。这些包括了所有 objective-c 系统框架-比如 foundation、uikit 和 spritekit,就像系统支持公共 c 类库。举个例子,想导入 foundation,只要简单地添加 import 语句到你写的 swift 文件的顶部。
swift
import foundation
这个 import 导入了所有 foundation 的 api,包括nsdate,nsurl,nsmutabledata,并且他们的所有方法、属性和类别都可以在 swift 中直接使用。
导入过程是非常简洁的。objective-c 框架在头文件中申明 api。在 swift 中,那些头文件被编译成 objective-c 的 module,接着被导入到 swift 作为 swift 的 api。导入决定了 objective-c 的 function,class,method 和 type 如何在 swift 中出现。对于 function 和 method,这个过程影响他们的参数和返回值。导入过程可以做下面这些事情:
1.重映射确定的 objective-c 类型到 swift 中的同等类型,就像 id 到anyobject
2.重映射确定的 objective-c 核心类型到 swift 中的替代类型, 就像nsstring到string
3.重映射确定的 objective-c 概念到 swift 中相匹配的概念,如pointers到optionals
在互用性章节,你将会了解到更多关于这些映射如何在你的 swift 代码进行取舍。 导入 swift 的模型到 objective-c 和从 objective-c 导入 swift 是非常相似的。swift 申明它的 api,比如一个框架作为 swift modules。同时这些 swift modules 会生成 objective-c 的头文件。这些头文件可以映射回 objective-c 的 api 中。一些 swift 的 api 不映射回 objective-c 因为他们取舍了语言特性发现这些在 objective-c 中不可用。关于在 objective-c 中使用 swift 的更多特性,请参看在同一项目中使用 swift 和 objective-c。