编写健壮的无字符串Swift代码

在不使用字符串的情况下使用情节提要,Xib和ViewController

您如何避免错误? 显然是因为没有编写任何代码。 但是,还有另一个神秘而又不那么幽默的答案。 通过不进行硬编码。

iOS最糟糕的功能之一是对字符串的过度依赖。 难怪如此轻视键值观察(KVO),是的,甚至包括使用故事板和视图控制器实例化。 随着Swift的发展,Apple试图减少字符串的使用,例如在选择器中。 例如,在Swift 2.2选择器使用之前,如下所示: button.addTarget(self, action: Selector("buttonTapped"), for: .touchUpInside) 。 然后,他们改进为: button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside) 。 但是仍然非常依赖,这带来了很大的潜在错误。 考虑以下iOS开发人员可以编写的完美代码:

使用字符串和强制转换实例化ViewController。 容易出错的做法。

注意使用字符串引用情节提要和实例化viewControllers。 在命名情节提要或viewController时犯错误的可能性非常大,这会导致错误代码。 随着代码中使用硬编码字符串的次数增加,在代码中产生逻辑(和致命)错误的机会也随之增加 。 我希望与tableview单元格标识符相关的崩溃能够引起一定的注意。

现在,让我们看看如何避免在代码中使用字符串。 首先,让我们添加一个UIViewController扩展,它不仅在编写代码时使用最少的字符串非常方便,而且在您的应用程序使用各种独立模块(还需要使用自己的故事板)的实例中增加便利性您的主要应用程序。

UIViewController扩展可从任何模块实例化ViewController

在这里, "(\self)" storyboardID类属性中,只需返回ViewController的名称。 为此,您要做的就是将ViewController的Storyboard ID命名为与ViewController类相同。 简单。 方法instantiateViewController(viewControllerClass: T.Type, inStoryboard: String, ofModule: Bundle?) -> T实例化任何viewController,只要它是类UIViewController,则此控制器在位于某些模块,无论您当前模块之内还是之外。

接下来,我们为故事板名称添加一个枚举 。 Swift之所以漂亮,是因为枚举可以具有属性,甚至可以具有方法。 请参阅下面的代码片段,以了解如何添加便捷方法。 在这里,我添加了方便的方法来实例化viewControllers,navigationControllers和tabBarControllers。

一个Storyboards Enum便捷套装,用于实例化ViewController

使用上面的枚举和UIViewController扩展,我们现在可以将代码从入门代码块修改为完全没有任何字符串的漂亮东西。

在不使用字符串的情况下实例化ViewControllers。 稳健的做法。

您可以扩展它以适应UITableViewCell(用于cellIdentifiers),甚至Xib文件,并完全消除代码中的字符串。 对于一般的字符串,例如UIAlertController消息和segue标识符,也应使用Strings文件。 这样,将来更容易跟踪错误并添加本地化。

在本文的下一篇文章中,我们将研究如何使用相互依赖的迦太基依赖项。 在GitHub线程上注意到这对许多开发人员来说是一场噩梦之后,我想我可以做出贡献。 希望您能从这篇文章中获得启发。 欢迎您提供反馈,并提出以后的文章要求。