Swift系列文章由CocoaChina翻译小组翻译自苹果的官方文档:Using Swift with Cocoa and Objective-C--Migration--Migrating Your Objective-C Code to Swift。本篇译者:@xudeheng(git主页),敬请勘误,欢迎在CocoaChina github主页查看更多文章!
迁移工作提供了一个重访现有Objective-C 代码的机会,也可以通过Swift代码来更好的优化app软件架构,逻辑以及性能。直接一点说,你将用先前学到的“mix andmatch”和“interoperability”这两个章节来进行增量迁移工作。“Mix-and-match”功能使得选择哪些特性和功能来用Swift来实现,以及哪些依然用Objective-C来实现变得简单。“Interoperability(互通性)”又使得将这些功能通畅地集成到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内部机制完成的了,对开发者是透明的。)
准备工作
1.在 Xcode 中,可选择File>New>File>(iOS 或者 OS X) > Other > Swift 为对应的 Objective-C .m 和 .h 文件创建一个 Swift 类。对比Objective-C类,你可以为新类选择相同的或者不同的名字。在Swift中,类的前缀是可选的。
2.导入相关系统框架。
3.如果你希望在 Swift 文件中访问 Objective-C 代码的话,可以填入一个 Objective-C 桥接头。具体的操作步骤,请看Importing Code from Within the Same AppTarget。
4.为使你的Swift 类能在 Objective-C 中访问使用,可以继承 Objective-C 类,或者标记上 @objc 属性。想要给类指定一个特殊的名字从而在Objective-C中使用,要确保标记上 @objc(<#name#>),<#name#>是你的Objective-C代码用来引用Swift类的名字。关于@objc更多信息,请看Swift Type Compatibility.
开始工作
1.你可以通过子类化Objective-C类,适配 Objective-C 协议或者其他更多方式来来设置Swift类,以集成Objective-C行为。更多信息,请参看Writing Swift Classes withObjective-C Behavior.
2.当你使用Objective-C API时,你需要知道 Swift 是如何翻译某些Objective-C 特性的。更多信息请参看Interacting with Objective-C APIs.
3.当用 Swift 编写用到 Cocoa 框架的代码时,记住某些类型是被桥接的,意味着你可以使用某些 Swift 类型来替代 Objective-C 类型。更多信息,请看Working withCocoa Data Types.
4.当你在 Swift 类中运用 Cocoa设计模式时,请参看Adopting Cocoa Design Patterns,以获取更多常见设计模式的转换信息。
5.如果打算将项目从 Objective-C 转换到 Swfit,请参看@L_404_10@.
6.在必要的时候,请通过@objc(<#name#>) attribute为属性和方法提供Objective-C 名称。比如你可以标记一个名为enabled的属性:
- varenabled:Bool{
- @objc(isEnabled)get{
- /*...*/
- }
- }
7.分别用 func 和 class func 来表示 instance(-) 和 class(+) 方法。
8.声明简单的宏来作为全域常量,并将复杂的宏转换为函数。
大功告成
1.在你的 Objective-C 代码中更新import语句(to #import "ProductModuleName-Swift.h"),像Importing Code from Within the Same App Target中描述的那样。
2.通过取消选中target membership复选框来移除原始的Objective-C .m文件。不要立刻删除 .m 和 .h 文件,以备解决问题使用。
3.如果你给 Swift 类起了一个不同的名字,请更新代码以使用 Swift 类名而不是Objective-C 名称。
技巧和提示
基于你现有的代码库,每次迁移经历都是不尽相同的。不过总有一些通用的步骤和工具来帮你解决代码迁移过程中遇到的问题。
1.记住:你不能在 Objective-C 中子类化Swift 类。因此,在应用中,你迁移的类不能有任何Objective-C 子类。
2.一旦迁移一个类到Swift中,你必须在编译前从target 中移除对应的 .m 文件,以避免出现重复的符号错误。
3.为了在 Objective-C 中可以访问并使用,Swift 类必须是一个 Objective-C 类的子类,或者必须被标记为 @objc。
4.当你在 Objective-C 中使用 Swift 代码时,记住Objective-C不能翻译那些特定于 Swift 的特性,请参看Using Swift from Objective-C.
5.可以通过 “Commond + 点击”一个 Swift 类名来查看它生成的头文件。
6.“Option + 点击”一个符号查看隐藏的信息,比如它的类型、属性以及文档注释等。