使用Swiftify将SVProgressHUD转换为Swift

Swift被开发人员所喜爱,并且显然是Apple生态系统以及通用编程的未来,因为它已被Apple开源,并且全世界的开发人员都为它做出了积极的贡献。 Swift代码更快,更易读,看起来像脚本语言一样自然有趣。 Objective-C非常强大,大量框架和Apple框架的许多部分都用Objective-C编写。

鉴于Swift现在已经在Swift 5中实现ABI稳定性,因此作为一种语言已经达到了一定程度的稳定性和成熟度,因此通过迁移到Swift来开始将来对我们的代码和框架进行验证始终是一个更好的选择。

SVProgressHUD 是一个非常流行的库,被开发人员广泛使用。 它以其使用简单和简洁的设计而优雅。

Swiftify for Xcode是一个非常强大的工具,可以将整个Objective-C项目转换为Swift。 我用它来转换项目,结果非常好而且很快,但是当我简短地研究了项目代码时,我对代码的结构或功能没有深入的了解。 我意识到最好一次转换一个项目类,测试转换后的类,然后继续重复该过程。

我强烈建议您在自己的代码或经过充分研究并有深入理解的代码上使用Swiftify for Xcode。

如果您要转换不是您自己编写的代码或您不了解的代码,我建议一次迁移一个类,使用现有代码进行测试,然后重复该过程,因为以后将调试整个项目很难。 分而治之总是更好。

我的整体方法可以用图形表示为:

查看SVProgressHUD中的代码结构,我转换文件的顺序如下:-

因此,在将Swiftify用于Xcode之后,我又从头开始,转换的第一个类是SVRadialGradientLayer 此类用于添加渐变蒙版类型,并且仅在一个位置调用。 转换SVRadialGradientLayer.m并在SVRadialGradientLayer.h中添加属性和函数。 转换很简单,并且很快即可完成。 只需应用一个修复程序,只需一个简单的Google搜索即可完成。 之后,我从目标中删除了这个Objective-C类,添加了新的Swift文件并运行了该项目,该项目按预期进行了编译和运行,因此我继续下一个文件。

下一个要转换的类是SVProgressIndefiniteAnimatedView 。 此类用于显示两种类型的不确定动画视图,即本机设计和平面设计。 在本机设计中,ProgressHud使用和显示动画视图,在平面设计中,显示签名UIActivityIndi​​catorView 。 我将代码转换为Swift,将属性设为私有,并添加了用于设置和获取属性的函数。

接下来,我从SVProgressAnimatedView类开始,该类负责显示带有进度指示器环的HUD。 它仅支持平面样式,不支持UIActivityIndi​​catorView

现在是项目的主类,该主类与外部代码协调并使用这些类来呈现HUD。 这个课程非常复杂。 我使用了前面提到的技术,例如利用setter和getters函数,将所有类函数放在不同的类扩展中。 该类使用自身的单个实例,即它是一个独立的Singleton类。 所有的类函数最终都使用此Single Instance

在最终完成之后,我还花了一些时间清理不推荐使用的功能。 我从类函数开始,一次完成转换。 然后是更大的实例方法,它们是库的内容。 慢慢地,文件被转换,并在助手编辑器中使用Swiftify查找原始源代码。 代码转换花了一些时间,有几个问题让我使用原始SVProgressHUD文件和Swift版本文件运行项目,并通过查看运行时值的差异进行调试。

这就是在上面的流程图中 ,我不会删除原始的Objective-C文件的原因,直到代码转换完成并且Swift代码正在运行并经过测试。

现在,如果我们愿意,可以通过不删除@objc前缀,并在用作代码接口的函数和属性中添加@objc前缀来保持与Objective-C的兼容性。

测试之后,我从函数和self中删除了@objc ,并对库进行了增强以使其成为线程安全的 。 现在,您可以从任何线程使用该库,始终可以从主线程创建并评估单个实例