Ограничьте текст определенным количеством слов в 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()
работать рано, хотя я особо не старался.)