Эффективно удалить последнее слово из строки в Swift
Я пытаюсь создать систему автозамены, поэтому мне нужно удалить последнее введенное слово и заменить его правильным. Мое решение:
func autocorrect() {
hasWordReadyToCorrect = false
var wordProxy = self.textDocumentProxy as UITextDocumentProxy
var stringOfWords = wordProxy.documentContextBeforeInput
fullString = "Unset Value"
if stringOfWords != nil {
var words = stringOfWords.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
for word in words {
arrayOfWords += [word]
}
println("The last word of the array is (arrayOfWords.last)")
for (mistake, word) in autocorrectList {
println("The mistake is (mistake)")
if mistake == arrayOfWords.last {
fullString = word
hasWordReadyToCorrect = true
}
}
println("The corrected String is (fullString)")
}
}
этот метод вызывается после каждого нажатия клавиши, и если пробел нажат, он исправляет слово. Моя проблема возникает, когда строка текста становится длиннее, чем около 20 слов. Он занимает некоторое время, чтобы заполнить массив каждый раз, когда символ нажат, и он начинает отставать до такой степени, что не может его использовать. Есть есть более эффективный и элегантный быстрый способ написания этой функции? Я был бы признателен за любую помощь!
2 ответов
1.
одно, итерация для этого не нужна:
for word in words {
arrayOfWords += [word]
}
вы можете просто сделать:
arrayOfWords += words
2.
разрыв цикла for предотвратит ненужную итерацию:
for (mistake, word) in autocorrectList {
println("The mistake is \(mistake)")
if mistake == arrayOfWords.last {
fullString = word
hasWordReadyToCorrect = true
break; // Add this to stop iterating through 'autocorrectList'
}
}
или даже лучше, полностью забудьте о for-loop:
if let word = autocorrectList[arrayOfWords.last] {
fullString = word
hasWordReadyToCorrect = true
}
в конечном итоге вы видите, соответствует ли последнее слово введенного текста любому из ключей в списке автозамены. Вы можете просто попробуйте получить значение напрямую, используя необязательную привязку, как это.
- - -
Я дам вам знать, если я думаю больше.
Это не отвечает на проблему "автозамены" OP напрямую, но это код, вероятно, самый простой способ ответить на вопрос, поставленный в заголовке:
Swift 3
let myString = "The dog jumped over a fence"
let myStringWithoutLastWord = myString.components(separatedBy: " ").dropLast().joined(separator: " ")