Swift马上就要迎接它的两周年纪念日了。到目前为止,它一直被大量地使用着并且随着开发者从Objective-C不断过渡到Swift,它的使用一直保持着持续增长。作为一个编程语言,Swift非常棒。使用它有非常有成效的感受,并且Swift有着很多现代编程语言的优良特性。
在经历了一些改变之后,Swift语言和它的平台似乎开始变得稳定了(忽略一些Swift 3的警告)。在这个角度上看,Swift语言的开发体验似乎应该变得越来越顺利,就好像平稳地运行在公开的海域上一样,不会横渡任何冰山的迷宫。在多数情况下我认为这个观点是正确的。然而,我仍然撞上了一些冰山。
考虑以下代码
let myCompany = [ "employees": [ "employee 1": ["attribute": "value"], "employee 2": ["attribute": "value"], "employee 3": ["attribute": "value"], "employee 4": ["attribute": "value"], "employee 5": ["attribute": "value"], "employee 6": ["attribute": "value"], "employee 7": ["attribute": "value"], "employee 8": ["attribute": "value"], "employee 9": ["attribute": "value"], "employee 10": ["attribute": "value"], "employee 11": ["attribute": "value"], "employee 12": ["attribute": "value"], "employee 13": ["attribute": "value"], "employee 14": ["attribute": "value"], "employee 15": ["attribute": "value"], "employee 16": ["attribute": "value"], "employee 17": ["attribute": "value"], "employee 18": ["attribute": "value"], "employee 19": ["attribute": "value"], "employee 20": ["attribute": "value"], ] ]
把以上代码复制到XCode中,点击“build”,然后去喝一杯咖啡。然后你得等 12个小时 再回来。是的,以上字典文字代码 至少 会花费12个小时来编译。编译时间几乎随着每一个增加的employee指数增长。好消息是这个 bug 在12月的时候就被提交了。坏消息是他还没有被修复……这种奇怪的问题会深深地嵌入你的代码库中并且造成极其糟糕的冗长的编译时间。
我在注意到我们的单元测试花费了一个非常冗长的时间之后发现了这个问题。最终,它变得非常恼人,所以我决定开始调研。我能够把问题缩小到一个单元测试中因为它要花上好几分钟来编译。这个测试并没有做任何奇怪的事情,只是定义了一个JSON结构用来测试我们分析语句(parseing)的能力。在经过了一些对代码的审查,和互联网的搜索之后,我遇到了以上的bug报告。我很好奇,我们究竟还会有多少其他的单元测试或者代码片段会造成这样一个臃肿的编译时间。
注意!Swift是没有办法有效的分析和编译简单的Dictionary/Array文法的!至少在这个问题解决之前,swift是没有办法这么做的,不只是这个问题,也一定要对其它可能的冰山长个心眼。
对于发现这个帖子的后来人,我提供一些运行的参数。我在上述例子中使用的是Swift 2.2和XCode7.3。运行xcrun swift -version之后的结果是这样的:
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29) Target: x86_64-apple-macosx10.9
对于那些有着极大兴趣的人,我会把测试/复现这个bug的项目放到我的 Github主页 上。