Как объединить несколько массивов, не замедляя работу компилятора?

Добавление этой строки кода заставляет мое время компиляции идти от 10 секунд до 3 минут.

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

Изменение этого параметра приводит к сокращению времени компиляции до нормального.

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

Почему первая строка заставляет мое время компиляции настолько резко замедляться и есть более элегантный способ объединить эти массивы, чем 5-строчное решение, которое я разместил?

Ответ 1

Он всегда +. Каждый раз, когда люди жалуются на взрывоопасные времена компиляции, я спрашиваю: "Приковали ли вы +?"? И это всегда да. Это потому, что + настолько сильно перегружен. Тем не менее, я думаю, что это значительно лучше в 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).