Как получить первые или последние несколько символов строки в цепочке методов?

Если я использую цепочки методов функционального стиля для обработки строк, я не могу использовать обычные механизмы для получения первого или последнего нескольких символов: у меня нет доступа к ссылке на текущую строку, поэтому я не могу вычислять индексы.

Пример:

[some, nasty, objects]
    .map( { $0.asHex } )
    .joined()
    .<first 100>
    .uppercased()
    + "..."

для усеченного вывода отладки.

Итак, как мне реализовать <first 100>, или мне нужно разбить цепочку?

Ответ 1

Я не знаю ни одного API, который делает это. К счастью, написать собственное - это простое упражнение:

extension String {
    func taking(first: Int) -> String {
        if first <= 0 {
            return ""
        } else if let to = self.index(self.startIndex, 
                                      offsetBy: first, 
                                      limitedBy: self.endIndex) {
            return self.substring(to: to)
        } else {
            return self
        }
    }
}

Снятие с конца похоже.

Найти полный код (включая варианты) и тесты здесь.