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