将完整的 Objective-C 应用程序转换为 Swift 的分步指南

已发表: 2018-03-14

自 2014 年发布以来,Apple 的编程语言 Swift 经历了惊人的增长。 该编程语言已成功跻身前 10 大编程语言之列与其前身 Objective-C 共享这一位置。 但是 swift 与 Objective-C 的战争从未平息。

随着这种流行度和令人兴奋的功能的增加,许多以前使用 Obj-C 的 iOS 应用程序开发人员已经转向 Swift 编程语言。 事实上,在 iOS 的 swift 或 Objective-C 之争中,LinkedIn、Yahoo Weather、Hipmunk 和 Lyft 等各种 iOS 应用程序已经从 Objective-C 升级到 Swift,而许多人正计划转换一个 Objective-C 应用程序到斯威夫特。

使 SWIFT 成为更好选择的因素

就我个人而言,自从第一个版本发布以来,我已经看到了 Swift 的演变,我可以说在 swift 与 C 之间, Swift 取代了 Objective-C的因素,比如

开源

Swift 是一种开源语言,Swift 的代码可以移植到比 Objective-C 更多的平台上。

速度

Swift for iOS 开发是一种静态类型语言,它与 LLVM 编译器一起工作,可以重用现有代码、消除未使用的资源、管理内联函数等。 此外,它的工作基于 C++ 最快的算法计算算法之一,这反过来证明了它比其前身具有竞争优势。

根据 Apple 的说法和我的经验,Swift 搜索算法比 Objective-C 快 2.6 倍。

可读性

与 Objective-C 不同,Swift 不依赖于 C 基础。 它使 iOS 开发人员能够删除嵌套的方法调用、在行尾跳过分号、避免将 @ 放在关键字的开头、使用“+”号连接字符串等等。 此外,Swift 类没有分为接口和实现部分。 这将代码长度减少到近一半,使其更具可读性。

例如,当 Lyft 应用程序从头开始用 Swift 语言重写时,应用程序代码从 75,000 行减少到 25,000 行。 这个令人印象深刻的数字减少了开发人员的工作量,而不会影响应用程序在客户端的性能。

交互式编码

凭借其 Playgrounds 功能,它可以让程序员编写大量代码或算法,同时在开发阶段收集反馈。 由于 Swift 代码是使用数据可视化编写的,这使得应用程序开发过程更加容易和平易近人。

安全

Swift 是一种更安全、更安全的语言,用于根据当前市场趋势构建应用程序。 它的语法和语言结构排除了使用 Objective-C 语言编码时常见的错误类型。 这意味着应用程序崩溃和出现问题行为的可能性较小。

与 Objective-C 的情况不同,用 Swift 编写的代码可以编译,并且可以修复错误,以及代码编写部分。 因此,与测试 Objective-C 代码的过程相比,Swift 在测试过程中表现得更好更快。

维护

由于 Swift 不像其前身那样依赖于 C,因此 Swift 应用程序开发的维护要容易得多。 Swift 成为 iOS 应用程序开发未来的原因

在使用 Objective-C 构建 iOS 应用程序的情况下,开发人员应该维护两个不同的代码文件以提高构建时间和代码效率。 然而,Swift 放弃了这种双文件机制,将 Objective-C 头文件 (.h) 和实现文件 (.m) 合并到一个文件 (.swift) 中。 LLVM 编译器在读取 Swift 文件时自动发现依赖关系,这对 iOS 应用程序开发人员来说是一个很大的好处。

除了上述因素之外,选择 Swift 而不是其他 Apple 编程语言的值得一提的好处是它与 Objective-C 的兼容性。 Apple 为应用程序开发人员提供了在同一个项目中使用两种语言的便利。 这不仅有助于从头开始使用 Swift 开发 iOS 应用程序,而且有助于使用 Objective-C 代码将现有应用程序升级到 Swift。

虽然您现在已经熟悉了两种 iOS 应用程序开发语言之间的哲学差异,但让我们在实际实现中讨论差异。

SWIFT VS OBJECTIVE-C:IOS 开发巨头之间的主要区别

凭借我在复杂的 Objective-C 代码库和 Swift 代码库方面的经验,您将遇到对现有概念的多次升级以及对各种新元素的介绍,这些元素使应用程序的开发过程更加迅速。 事不宜迟,让我们来看看在 swift vs Objective c 的战争中你会发现新的/不同的一切。

可选的

当我们谈论 swift 与 Objective-C 的性能时,我们可以在 nil 对象上调用方法来获得 Obj-C 中的零值。 如果出现意外的 nil 值,我们必须手动执行 nil 检查以了解未定义的行为。 然而,这个问题可以通过使用 Optional 来解决,这是 Swift 代码中引入的一个新概念。 Optional 允许可能无法返回有意义的值的函数返回封装在 optional 或 nil 中的值。

声明 Optional 类型的语法是:

公共枚举 Optional<Wrapped> :_Reflectable, NilLiteralConvertible

实际上,它可以具有 Wrapped 类型的值或不存在的值。

Swift 渲染了声明类型可选的语法糖,所以我们可以用 String? 替换 Optional<String>

主要有两种方法可以从可选容器中获取包装值:

可选链接:用于 if-let 条件语句仅在存在时才接收值的情况。
强制包装:当可选的声明变量为非零时使用。 如果该值存在,它将在不执行条件的情况下提供输出。 但是,在另一种情况下,它会崩溃。
我们还可以在 Swift 语言中找到隐式展开的可选项,声明为 String!

例如:

X类

{

var aString: 字符串

var bString:字符串!

var cString: 字符串?

初始化(字符串:字符串)

{

aString = 字符串

}

}

这里,

字符串永远不能为零。 这个变量在对象初始化的时候有一个值是至关重要的,否则程序会导致崩溃。
B 字符串可以为零。 但是,如果您尝试访问 nil 对象,程序将会崩溃。
C String 可以为 nil,并且应该被视为常规可选变量。
扩展
Obj-C 中的扩展和类别被合并到一个实体中,即 Swift 语言中的扩展。 扩展为已经存在的类、枚举、结构或协议添加了新功能,最好的部分是您无需访问原始源代码即可扩展类型。

元组
除了 Optionals,Apple 新开发语言中引入的另一种新数据类型是元组。 元组(就地用户定义的数据类型)基本上被认为将许多值分组到一个复合组中。 如果您认为在某个地方创建模型可能会矫枉过正并且字典对读者不够友好,那么这是需要考虑的正确因素。 要了解更多元组,请参阅此博客

泛型
泛型是 Swift 编程语言最显着的特性之一,事实上,许多 Swift 标准库都是用 Swift 代码创建的。 通用代码让开发人员可以编写灵活的、可重用的函数和类型,这些函数和类型可以与不同的类型集一起工作,但要符合定义的要求。 这最大限度地减少了重复的风险,并通过清晰、抽象的方法增强了代码的可读性。

根据我的经验,泛型一开始很难得到,就像递归一样。 但是,当你掌握它时,你将能够打开一个解决令人厌烦的逻辑问题的全新世界。

枚举
在 Objective-C 代码中,枚举仅限于原始类型。 为了将整数枚举值映射到显示输出的字符串,您必须引入一个数组或转向开关控制结构。 但是,您无需使用 Swift iOS 应用程序开发语言来解决这些麻烦。

Swift 提供了多种新枚举以及更多选项。 Swift 枚举可以有关联的值,Swift 枚举 case 可以保存一组预定义的字段。 事实上,Swift 枚举可以是递归的并且可以存储原始值。

例如:
代码

下标
下标可以被看作是在不使用方法的情况下从类、枚举和结构中的序列、集合或列表中访问信息的媒介。 您可以考虑使用下标按索引设置和检索值,而无需创建单独的存储和检索方法。 例如,您可以将 Array 实例中的元素作为 someArray[index] 访问,将 Dictionary 实例中的元素作为 someDictionary[key] 访问。

声明下标的语法如下:

下标(索引:Int)-> Int {

得到 {

//用于声明下标值

}

设置(新值){

//用于定义值

}

}

类型推断

Swift 还为 iOS 应用程序开发提出了类型安全性,根据这种安全性,变量声明为特定类型时,其类型将是静态且不可更改的。 编译器将根据您分配的值确定(或推断)您的变量将是什么类型。

例如:

代码 1
在这里,当您尝试将数值初始化为 str2 变量时,编译器将显示错误(见下文)

代码 03

职能
Swift 编程语言中的 Function 语法比复杂的 Objective-C 代码风格更灵活。 在 Swift 中,每个函数都有一个类型,该类型由函数的参数类型和返回类型组成,这意味着您可以将函数分配给变量或将其作为值传递给其他函数(如下例所示):

代码图像

除此之外,Swift 还允许应用程序开发人员为功能参数定义默认值。

错误处理
Swift 提供了一种全新的方法来在运行时抛出、捕获、循环和操作可恢复的错误。 要了解 Swift 中的错误处理,请参阅博客。

除此之外,使 Swift 应用程序开发比 Objective-C 应用程序开发双赢的各种概念是:

楷模
在 Swift 的情况下,模型更喜欢是结构而不是类。

协议
在第一个 Apple WWDC 视频中,swift 被介绍为“面向协议的语言”。 协议可以定义为适合特定任务/功能的方法、属性和其他实体的蓝图。 它们可以被类、枚举或结构所包含,以促进这些需求的实际实现,并且与 Obj C 相比更强大,具有提供默认实现、合并泛型等特性。

作为一名 iOS 应用程序开发人员,我更喜欢在定义类之前创建一个协议,这是利用 Apple 高级编程语言优势的最有效做法。

函数式编程方法
与使用传统的循环或引用类型相比,Swift 使开发人员能够使用更多的函数式方法来解决平凡的问题。 在这里,观点是根据解决方案来分析问题,而不是像传统方法那样确定如何获得解决方案。

根据我对这两种 iOS 语言的经验,我注意到的一件事是,我们在 Objective-C 中使用 for 循环进行迭代所做的事情可以使用 Swift 中的 Filter、Map 和 Reduce 的概念来完成。 要深入了解函数式编程中的这些高阶函数,请参阅博客。

将完整的 OBJECTIVE-C 应用程序转换为 SWIFT 的分步指南

今天,有各种工具可以将应用程序从 Objective-C 逐行转换为 Swift。 但是,我建议不要使用任何。 尽管这两种 iOS 语言都是可互操作的,但它们的程序范式是不同的。 将应用程序从 Obj-C 直接迁移到 Swift 会带来更高的使用错误范例的风险。 让我详细说明一下。

与其前身不同,Swift 受到函数式编程范式的影响,这使得它严重依赖于不变性。 例如,如果你谈论数组和字典——这些基本模型在 Objective-C 中曾经是一个引用类型,但在 Swift 中它们是值类型,因此是不可变的。 这意味着使用任何工具下意识地将 Obj-C 代码转换为 Swift 将使您面临大量难以调试的错误。 此外,Swift 有大量的新特性(如上所述),它们可以让算法/方法更高效,编程更快捷! 事实上,这也是 Apple 推出新语言而不是升级 Obj-C 的主要原因。 考虑到所有这些点,我强烈建议大家从头开始用 Swift 编写一个新的应用程序,而不是从 Obj-C 到 Swift 的逐行转换。

不过,如果您希望将完整的 Objective-C 应用程序转换为 Swift,您可以使用的一个工具是 Swiftify。 该工具简化了将 Obj-C 代码一键升级为 Apple 新编程语言的过程; 节省数千小时的工作时间。 互操作性的特性可以轻松地将转换后的 iOS 代码集成回 Objective-C,这意味着您可以探索 Swift 提供的无数选项,然后将其集成回您的 Obj-C 项目,而无需一次重写所有内容。

为转换准备现有应用代码
从最新的 Obj-C 代码开始总是更好。 这是因为 Xcode 使用了现代的 Objective-C 转换器,它可以帮助您:

1. 尽可能将 id 更改为 instancetype
2. 使用正确的枚举宏
3. 升级到更新的@property 语法

虽然转换器有助于分析和应用潜在更改的机制,但它并不描述代码的语义。 因此,建议所有 iOS 应用程序开发人员手动检查所有内容,然后确认更改。

要使用转换器,请选择Edit -> Refactor -> Change to Modern Objective-C syntax。

将 Objective-C 代码迁移到 Swift 的过程
将一个完整的 Objective-C 应用程序转换为 Swift 最有效的方法是,首先,一次一个类,尤其是一个没有任何子类的类,因为你不能在 Obj-C 中子类化 Swift 类。

将与类相关的 .m 和 .h 文件替换为单个 .swift 文件。 这样,从接口到实现的所有内容都将自动进入 Swift 文件。 此外,如果需要,您不需要创建头文件,因为 Xcode 会自动生成头文件。

设计桥接头文件
当您添加第一个 .swift 文件时,您会发现如下所示的提示。

快速代码12

单击“创建桥接头”选项。

分步指南

1. 选择一对要转换成 Swift 的 .h 和 .m 文件。 如果要转换整个项目,请将 AppDelegate 类留待以后使用。
2. 在整个代码中搜索#import “MyViewController.h”并将其从Objective-C Bridging Header 文件([MyProject]-Bridging-Header.h)中删除。
3. 将所有 .m 文件中的 #import “[filename].h” 实例替换为 #import “[MyProject]-Swift.h” 并将 @class [filename] 而不是 #import “[filename].h” 放入所有 .h 文件。
4、将部分Obj-C文件转换为Swift。 这可以使用“Swiftify for Xcode”的 Finder 扩展轻松完成。 否则,将 .m 和 .h 文件的内容复制到 .swift 并使用 Swiftify Xcode 扩展中提供的“将文件转换为 Swift”选项。
5. 将项目中的 .h 和 .m 文件替换为转换后的 .swift 文件。
6. 编译工程并修复转换错误。 虽然使用 Xcode 自动修复建议可以轻松管理许多问题,但您也可以依靠 Swiftify 报告和修复项目中多次出现的错误。
7. 完成后,构建并运行项目。 如果出现“找不到类”然后崩溃的问题,请在情节提要编辑器中找到对它的所有引用。 在 Identity Inspector 中重新输入类名,保存并重试。
8. 如果要转换整个项目,现在可以转换 AppDelegate 类。 此时,所有其他文件都已转换为 Swift,因此,如果目标中没有 Obj-C 文件,您可以轻松删除 main.m 和 .pch(预编译头)文件。

你更喜欢哪种做法——从头开始用 Swift 创建一个新的 iOS 应用程序,还是将 Objective-C 完全转换为 Swift? 通过下面的评论部分分享您的观点。