Эффективно удалить последнее слово из строки в 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: " ")
