如何在不降低编译器速度的情况下合并多个数组?

时间:2016-09-14 12:45:28

标签: ios arrays swift compilation

添加这行代码会导致编译时间从10秒增加到3分钟。

var resultsArray = hashTagParticipantCodes + prefixParticipantCodes + asterixParticipantCodes + attPrefixParticipantCodes + attURLParticipantCodes

将其更改为此会使编译时间恢复正常。

var resultsArray = hashTagParticipantCodes
resultsArray += prefixParticipantCodes
resultsArray += asterixParticipantCodes
resultsArray += attPrefixParticipantCodes
resultsArray += attURLParticipantCodes

为什么第一行会导致我的编译时间大幅减慢,并且有一种更优雅的方式来合并这些数组而不是我发布的5行解决方案?

1 个答案:

答案 0 :(得分:11)

总是+。每当人们抱怨爆炸性编译时,我会问“你有链接+吗?”它始终是肯定的。这是因为+如此严重超载。也就是说,我认为这在Xcode 8中要好得多,至少在我的快速实验中是这样。

您可以通过加入数组而不是添加数组来显着加快速度而不需要var

let resultsArray = [hashTagParticipantCodes,
                    prefixParticipantCodes,
                    asterixParticipantCodes, 
                    attPrefixParticipantCodes,
                    attURLParticipantCodes]
                   .joinWithSeparator([]).map{$0}

最后的.map{$0}是强制它回到数组中(如果你需要它,否则你可以使用懒惰的FlattenCollection)。你也可以这样做:

let resultsArray = Array(
                   [hashTagParticipantCodes,
                    prefixParticipantCodes,
                    asterixParticipantCodes, 
                    attPrefixParticipantCodes,
                    attURLParticipantCodes]
                   .joinWithSeparator([]))

但是检查Xcode 8;我相信这至少是部分修复的(但使用.joined()仍然要快得多,即使在Swift 3中也是如此。)