Swift:常见错误无人问津-扩展

您好,我亲爱的开发人员,

查看代码时,我有3种状态,每分钟对应的WTF数量从最坏到最好:

  1. 30…无限->我想杀死一个向世界介绍THAT的人,他是最坏的人,即使是最血腥的独裁者,例如斯大林,波尔布特或希特勒,也比他更幼稚。
  2. 10 .. 我喜欢那个家伙/女孩,(他)他很聪明,我们可以一起工作并仍然生存,但是,是的,每个人都有他/她自己的缺点。
  3. 0 .. 那位开发人员很棒,我想向他/她学习并承受他/她的孩子。

第一类代码的完美示例是我在过去的iOS 3中见过的“小”类,该类从API下载了一些内容,对其进行了解析并返回了结果。 很简单,不是吗? 没有人不能破坏这样一个简单的代码,对吗? 错误。 实施是可怕的。 您是否认为该人使用了ASIHTTPRequest(据我所记得,当时还没有AFNetworking或AlamoFire)? 不? 您是否认为此人在NSURLConnection周围使用了包装器? 不。 但是他当时使用了什么? 好吧,他使用UIWebView从API下载JSON。 我可以承认,手上沾满了鲜血,所以我在等待警察被监禁。

但是前段时间还有另一种情况,当时这个家伙刚刚达到31 WTF / m。 一切都差不多,除了一件事,他热衷于编写类似于以下代码的代码:

那太可怕了。 试想一下,忘记放置beginUpdatesendUpdates,或者只是在重构期间将其删除。 这将导致一些麻烦,特别是如果我们将多个更新嵌套在一起。 此外,在整个项目中,有几个这样的代码部分,出于自身的利益,我们可以将其视为重复。 但是请不要害怕,好老的Oleksa对您有建议,它是从基督世世代代以来传给我的家人的,现在我很慷慨地与您分享(tssssh,别告诉其他人):“使用类别/扩展名和闭包”:

此扩展名是完全可重用的,可以从一个项目拖到另一个项目,也可以直接装上荚(抱歉,这里没有迦太基,Artsy和Cocoapods是最好的,我是他们的忠实拥护者)。

这些神圣的知识也可以应用于协议:

我们在Swift中使用了协议扩展,在ObjC中使用了一些很棒的宏(尽管这值得商de,有些开发人员可以很容易地带着我坐在里面把我的车烧掉,只是要提一下它们,如果有兴趣的话,请看一下: IDPLocking),可以解决NSLock的问题:

再次提供与UITableView相同的便利。 而且没有忘记解锁的风险。 而且,由于有了协议扩展,我们可以在所有符合NSLocking的对象中免费获得该行为。 而且我们甚至更进一步,现在我们实际上可以在不使用外部变量的情况下获得函数的结果。 为什么行得通? 因为Swift中的Void是一个值,所以它等于空tuple ()

尽管可以在扩展中以多种方式应用相同的想法。 由于此方法只是使用函数注入行为,因此您可以尝试将其用于扩展之外的其他方面。

就是这样,伙计们。 祝您有美好的一天,无论您身在何处,都要保持干燥。