我们希望得到的东西是Swift,第1部分

Swift编程语言是一种特殊的东西。 它是最直观,最令人沮丧的语言之一,并且由于苹果建立了庞大的社区,它每年以无数令人敬畏的功能增长。 与Objective-C相比,在Swift中完成许多工作变得更快,更干净!

在DSW,我们使用Swift write 100%编写我们的iOS软件。 我们甚至正在探索使用Vapor之类的工具来编写服务器端Swift(更多内容将在后面介绍)。 但是像许多开发人员一样,我们偶尔会发现自己在Swift的内置类型上构建了有用的扩展,我们希望这些内置类型可以直接使用。

在某些情况下,这些辅助方法最终会在我们的整个代码库中使用,并成为我们体系结构的关键

在本文中,我将分享一些我们最常用的辅助方法,以及为什么我们喜欢使用它们。 这些方法在共享框架中定义,并由我们所有的iOS应用程序使用。 也许有一天这些将以Swift语言提案结尾,但是现在您可以随意使用和分享您认为合适的摘录!


从集合(例如数组)中拉出元素的标准方法是使用Collection定义的下标:

如果Index不包含在集合的indices ,则系统将引发异常。 这意味着我们需要首先验证索引,然后访问元素:

上面的例子很常见。 在很多情况下(例如,更新可重用的UI时),如果元素不存在于集合中,则退回到nil至关重要。

我们怎样才能使它更容易? 让我们在Collection上添加一个新的下标,它可以一次将数组越界异常转换为nil

由于我们的.text属性已经是Optional ,我们现在可以将其转换为单线!

另外,我们的新下标甚至接受Optional作为输入,并将通过方法传播该nil

我们可以在感觉满意的任何地方使用该下标,而在其他地方仍然可以使用内置的下标。 真好!

如果您的设计师提供RGBA颜色,您可能会注意到您的代码杂乱无章,如下所示:

我们如何才能缩短此方法调用,消除复制的除法逻辑并仍然保持轻巧?

一种选择是使用HEX值进行初始化,这是完全有效的方法,具体取决于场景。 但是,该逻辑需要字符串验证,提取,扫描和转换为RGBA空间。 不完全是“轻量级”。

事实证明,通过使用可变参数函数,我们可以创建一种超简洁的方法来初始化具有原始RGBA值的颜色。 一探究竟!

现在,创建相同的RGBA颜色变得很容易:

不到原始通话时间的一半!

请注意,我们使用第一个示例中的Collection[safe:]下标来增强此方法的功能。 想象一下,如果没有它,我们将不得不编写多少额外的代码……

我们甚至可以省略alpha分量,仅在需要时定义RGB颜色。 此扩展不仅缩短了我们的代码,而且避免了整个代码库中的数学错字!

您是否曾经需要将Array转换为Array并发现自己正在与编译器抗争?

开发人员在StackOverflow上已多次要求使用此技巧,但我们对通常推荐的解决方案(使用compactMap (以前为flatMap )) compactMap 。 尽管在某些情况下可行,但此方法是为其他目的而构建的,并且可能产生意外的副作用。

我们发现Senseful的此解决方案是一个很好的方法。 这是我们喜欢的一些东西:

  • 它只对序列进行一次迭代,使我们保持O(n)的复杂度
  • 该方法的名称清楚地描述了其效果
  • 它可以可靠地用于多维序列,没有副作用

解决方案如下所示:

非可选Sequence最后一个扩展是在我们不指定实际上包含可选序列的序列类型时帮助编译器。 在涉及泛型的情况下,它也很有用。

使用此扩展非常简单:

第二个示例将无法使用compactMap ,因为结果将是[1, 2, 3, 4] ,而不是我们期望的结果。

这种辅助方法对我们来说是无价的!


这些只是我们定期使用的一些代码片段,由于它们在整个代码库中可能会产生影响,因此值得重点介绍。 请继续关注本文的第2部分,我们将在其中探索更多示例!


Tyler Tillage是DSW技术团队的首席开发人员。 您可以在 Twitter LinkedIn 上查看他