Ограничьте текст определенным количеством слов в Swift

В мобильном приложении я использую API, который может обрабатывать не более 300 слов. Как я могу обрезать строку в Swift, чтобы в ней не было больше слов?

Родной .trimmingCharacters(in: CharacterSet) похоже, не может этого сделать, поскольку он предназначен для обрезки определенных символов.

1 ответ

Не существует готового способа ограничить количество слов в строке.

Если вы посмотрите на этот пост , он документирует использование метода и установку параметра .byWords. Похоже, он возвращает массив Range значения.

Вы можете использовать это для создания расширения для String, которое будет возвращать первые X слов этой строки:

      extension String {
    func firstXWords(_ wordCount: Int) -> Substring {
        var ranges: [Range<String.Index>] = []
        self.enumerateSubstrings(in: self.startIndex..., options: .byWords) { _, range, _, _ in
            ranges.append(range)
        }
        if ranges.count > wordCount - 1 {
            return self[self.startIndex..<ranges[wordCount - 1].upperBound]
        } else {
            return self[self.startIndex..<self.endIndex]
        }
    }
}

Если мы затем запустим код:

      let sentence = "I want to an algorithm that could help find out how many words are there in a string separated by space or comma or some character. And then append each word separated by a character to an array which could be added up later I'm making an average calculator so I want the total count of data and then add up all the words. By words I mean the numbers separated by a character, preferably space Thanks in advance"

print(sentence.firstXWords(10))

Результат:

Я хочу найти алгоритм, который поможет выяснить

С использованием enumerateSubstrings(in: Range) даст гораздо лучшие результаты, чем разделение вашей строки с помощью пробелов, поскольку в обычном тексте гораздо больше разделителей, чем просто пробелы (новые строки, запятые, двоеточия, пробелы и т. д.). Он также будет работать для таких языков, как японский и китайский. в которых часто нет пробелов между словами.

Возможно, вы сможете переписать функцию, чтобы завершить перечисление строки, как только она достигнет желаемого количества слов. Если вам нужен небольшой процент слов в очень длинной строке, это сделает ее значительно быстрее (код выше должен иметь O(n)производительность, хотя я еще не копал достаточно глубоко, чтобы быть уверенным в этом. Я также не мог понять, как прекратить enumerateSubstrings() работать рано, хотя я особо не старался.)

Другие вопросы по тегам