将 Objective-C 代码迁移到 Swift(Swift 2.0更新)-b
本节内容包括:
为你的Objective-c代码做好迁移准备 (Preparing Your Objective-C Code for Migration)
迁移过程(The Migration Process)
问题解决提示(Troubleshooting Tips and Reminders)
迁移工作提供了一个重新审视现有 Objective-C 应用程序的机会,并通过 替换部分Swift 代码来更好的优化应用程序的架构,逻辑以及性能。换句话说,所谓增量app迁移,就是让你使用之前的工具-mix and match 来提升相互之间的可操作性。当要选择哪些特性和功能来用 Swift,哪些依然用 Objective-C 实现时,Mix-and-match让这一切变得简单。Swift 和 Objective-C 的互用性又使得将这些功能集成到 Objective-C 变得并不困难。通过这些工具可以开放 Swift 的扩展功能并集成到现有的 Objective-C 项目中而完全不必立刻使用 Swift 重写整个项目。
为你的Objective-C代码做好迁移准备
在开始迁移你的代码之前,请确保你的 Objective-C 和 Swift 代码间有着最佳兼容性。这意味着整理并使用 Objective-C 的现代化特性来优化你的现有项目。为了和 Swift 进行更容易的无缝交互,你的现有代码需要遵循现代编码实践。在开始前,有个简短的适配练习列表,参看Adopting Mordern Objective-C。
迁移过程
最有效迁移代码的方式是基于逐个文件,即一次完成一个类。由于你不能在 Objective-C 中继承 Swift类, 最好选择一个没有子类的(译者:从类的继承角度来看,应该先从类族树的叶子节点开始,自底向上的进行迁移操作)。你就可以用单个.swift文件来代替对应的.m和.h文件了。你所有的实现代码和接口将直接放进单个 Swift 文件。你不用再创建头文件了;Xcode 会在你需要引用的时候自动生成头文件。(译者:当然这是在xcode内部机制完成的了,对开发者是透明的)
准备工作
在 Xcode 中:File>New>File>(iOS 或者 OS X) > Other > Swift 为对应的 Objective-C.m 和.h文件创建一个 Swift 类。
导入相关系统框架。
如果你希望在 Swift 文件中访问 Objective-C 代码的话,可以填入一个 Objective-C 桥接头。具体的操作步骤,请看 Importing Code from Within the Same App Target。
为使你的 Swift 类能在 Objective-C 中访问使用,可以继承 Objective-C 类,或者标记上@objc属性。为类指定特殊的名称,以在 Objective-C 中使用,标记上@objc(#name#), <#name#>就是在 Objective-C 中引用的 Swift 类名。 更多信息,请看Swift Type Compatibility。
开始工作
你可以通过继承 Objective-C 类,适配 Objective-C 协议,或者更多的方式,来让 Swift 类集成 Objective-C 行为。更多信息,请看Writing Swift Classes with Objective-C Behavior
当你使用 Objective-C APIs 的时候,你需要知道 Swift 是怎样来翻译某些 Objective-C 特性的。更多信息,请看Interacting with Objective-C APIs
当用 Swift 编写用到 Cocoa 框架的代码时,记住某些类型是被桥接的,意味着你可以使用某些 Swift 类型来替代 Objective-C 类型。更多信息,请看Working with Cocoa Data Types
当你在 Swift 中运用 Cocoa设计模式得时候,请看 Adopting Cocoa Design Patterns获取更多的通用设计模式的转换信息。
对于打算将项目从 Objective-C 转换到 Swfit 的人,请看 Properties。
在必要的时候,请为 Swift 的属性或方法,通过@objc(<#name#>)属性来提供 Objective-C 名称,就像这样:
|
1
2
3
4
5
|
var enabled: Bool { @objc(isEnabled) get { /* ... */ }} |
分别用func和class func来表示 instance(-) 和 class(+) 方法。
声明简单的宏来作为常量,将复杂的宏转换为函数。
大功告成
在你的 Objective-C 代码中更新 import 语句为 #import "模块名-Swift.h",可参阅Importing Code from Within the Same App Target中曾有提到。
在Target 的成员选择框中去掉勾选框来移除原始的 Objective-C.m文件.不要立刻删除.m和.h文件,以备解决问题用。
如果你给 Swift 类起了一个不同的名字,请使用 Swift 类名代替 Objective-C 名。
问题解决提示
尽管对于不同的项目,迁移的经历是不尽相同的,无论怎样,都有一些通用的步骤和工具能帮你解决代码迁移时碰到的问题:
记住:你不能在 Objective-C 中继承 Swift 类。因此,被你迁移的类不能有任何的 Objective-C 子类存在于你的应用中。
当你迁移一个类到 Swift 的时候,你必须从 target 中移除相关的.m文件,以避免编译时提示出现重复的符号等编译错误。
为了在 Objective-C 中可以访问并使用,Swift 类必须是一个 Objective-C 类的子类,或者被标记为@objc。
当你在 Objective-C 中使用 Swift 代码的时候,记住 Objective-C 不能理解那些 Swift 的某些特性,请看Using Swift from Objective-C
可以通过Commond + 单击一个 Swift 类名来查看它生成的头文件。
可以通过Option + 单击一个符号来查看更详细的信息,比如它的类型,属性以及文档注释等。
将 Objective-C 代码迁移到 Swift(Swift 2.0更新)-b的更多相关文章
- 将Spring实战第5版中Spring HATEOAS部分代码迁移到Spring HATEOAS 1.0
最近在阅读Spring实战第五版中文版,书中第6章关于Spring HATEOAS部分代码使用的是Spring HATEOAS 0.25的版本,而最新的Spring HATEOAS 1.0对旧版的AP ...
- 快看Sample代码,速学Swift语言(1)-语法速览
Swift是苹果推出的一个比较新的语言,它除了借鉴语言如C#.Java等内容外,好像还采用了很多JavaScript脚本里面的一些脚本语法,用起来感觉非常棒,作为一个使用C#多年的技术控,对这种比较超 ...
- 快看Sample代码,速学Swift语言(2)-基础介绍 快看Sample代码,速学Swift语言(1)-语法速览
快看Sample代码,速学Swift语言(2)-基础介绍 Swift语言是一个新的编程语言,用于iOS, macOS, watchOS, 和 tvOS的开发,不过Swift很多部分内容,我们可以从C或 ...
- 在同个工程中使用 Swift 和 Objective-C(Swift 2.0更新)-b
本节包含内容: Mix and Match 概述(Mix and Match Overview) 在同个应用的 target 中导入(Importing Code from Within the Sa ...
- Swift— Swift编码规范之命名规范-备
程序代码中到处都是自己定义的名字,取一个有样并且符合规范的名字非常重要. 命名方法很多,但是比较有名的,广泛接受命名法有: 匈牙利命名,一般只是命名变量,原则是:变量名=类型前缀+描述,如bFoo表示 ...
- EF CodeFirs 代码迁移、数据迁移
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 标题叫EF CodeFirs 代码迁移.数据迁移. ...
- Python3中的新特性(3)——代码迁移与2to3
1.将代码移植到Python2.6 建议任何要将代码移植到Python3的用户首先将代码移植到Python2.6.Python2.6不仅与Python2.5向后兼容,而且支持Python3中的部分新特 ...
- ubuntu下lamp环境配置及将window代码迁移至linux系统
因为最近要用需要去实现项目中的一个功能,比较好的做法就是在http://i.cnblogs.com/EditPosts.aspx?opt=1linux中实现.所以最近就将自己的代码全部迁移到linux ...
- 为什么你需要将代码迁移到ASP.NET Core 2.0?
随着 .NET Core 2.0 的发布,.NET 开源跨平台迎来了新的时代.开发者们可以选择使用命令行.个人喜好的文本编辑器.Visual Studio 2017 15.3 和 Visual Stu ...
随机推荐
- poj3258
题目翻译 二分法(其实两个单词的意思分别是河,跳格子游戏,至于为啥翻译成二分法- -只能说英语博大精深啊) 奶牛每年举办一场有特色的跳格子游戏(很明显题目翻译错误)涉及到在河里从一块岩石跳到另一块岩石 ...
- Git 的优点
1. 快速 如果你每移动一下鼠标都要等待五秒,是不是很受不了?版本控制也是一样的,每一个命令多那么几秒钟,一天下来也会浪费你不少时间.Git的操作非常快速,你可以把时间用在别的更有意义的地方. 2. ...
- struct--------构造函数对结构体初始化的影响
struct--------构造函数对结构体初始化的影响. 没有构造函数时使用如下: struct ClassBook{ int number; int age; }; int main() { ...
- [转]Android实现计时与倒计时(限时抢购)的几种方法
在购物网站的促销活动中一般都有倒计时限制购物时间或者折扣的时间,这些都是如何实现的呢? 在一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是Timer与 TimerTask, 虽然此方法通用,但 ...
- Directx 3D编程实例:多个3D球的综合Directx实例
最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档.于是我也觉的有这个必要.写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客 ...
- SVN server的搭建
当做大的项目是,svn是代码管理的好工具,假设是用自己的server,那么须要搭建SVNserver. Subversion是一款很优秀的svnserver工具,笔者採用VisualSVN serve ...
- JavaScript和prototype
Protoype这个词在javascript中可以有两种理解: 第一种是作为javascript中的一个属性,其一般出现的形式为:类名.prototype. prototype 属性让你有能力向对象添 ...
- Day1 - Python基础1 介绍、基本语法、流程控制
Python之路,Day1 - Python基础1 本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼 ...
- Android开发--WIFI实现
wifi的基本结构 在Android的官方文档中定义了如下五种状态: WIFI_STATE_DISABLING WIFI网卡正在关闭 0 WIFI_STATE_DISABLED WIFI网卡不 ...
- 解决ASP.NET中ReportView与IE11的兼容性问题
前久发现以前用ReportView开发的一个软件的报表,在IE11上运行时出错,陆续查了好几天才解决了问题. 开发环境: VS2010,ReportView 10.0.402,RDLC报表模板 问题: ...