swift与oc的互用--代码迁移

来源:互联网 发布:可以赚钱的网络兼职 编辑:程序博客网 时间:2024/04/28 15:06

转自译者:@xudeheng(git主页)

迁移工作正好提供了一个重新审视现有Objective-C应用程序的机会,也可以通过Swift代码来更好的优化应用程序的体系架构,逻辑以及性能。直接的说,你将用先前学到的mix and match以及这两个语言间的互操作性来进行增量迁移工作。Mix-and-match功能使得选择哪些特性和功能来用Swift来实现,哪些依然用Objective-C来实现变得简单。SwiftObjective-C的互用性又使得将这些功能集成到Objective-C变得并不困难。通过这些工具可以开放Swift的扩展功能并集成到现有的Objective-C项目中而完全不必立刻使用Swift重写整个项目。


为你的Objective-C 代码迁移做好准备

在开始迁移你的代码之前,请确保你的Objective-CSwift代码间有着最佳兼容性。这意味着整理并使用Objective-C的现代化特性来优化你的现有项目。为了和Swift进行更容易的无缝交互,你的现有代码需要遵循现代编码实践。 


迁移过程

最有效迁移代码的方式是基于逐个文件的方式,即一次完成一个类。由于你不能在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 withObjective-C Behavior

  •   当你使用Objective-C APIs的时候,你需要知道Swift是怎样来翻译某些Objective-C特性的。更多信息,请看Interacting with Objective-C APIs

  •   当用Swift编写用到Cocoa框架的代码时,记住某些类型是被桥接的,意味着你可以使用某些Swift类型来替代Objective-C类型。更多信息,请看Workingwith Cocoa Data Types

  •   当你在Swift中运用Cocoa设计模式得时候,请看Adopting Cocoa DesignPatterns获取更多的通用设计模式的转换信息。

  •   对于打算将项目从Objective-C转换到Swfit的人,请看Propeties

  •   在必要的时候,请为Swift的属性或方法,通过@objc(<#name#>)属性来提供

    Objective-C名称,就像这样:

    var enabled: Bool {    @objc(isEnabled) get {

    /* ... */} 


page50image16656page50image16816page50image24480page50image24640page50image24800page50image24960page50image25120page50image25280page50image25440
page51image3568page51image3992page51image4152
  •   分别用funcclass 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 +点击一个符号来查看更详细的信息,比如它的类型,属性以及文

    档注释等。 

0 0
原创粉丝点击