我正在尝试构建一个自动更正系统,因此我需要能够删除键入的最后一个单词并将其替换为正确的单词。我的解决方案:
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个单词时,我的问题就出现了。每次按下一个字符时,它需要一段时间来填充数组,并且它开始滞后到无法使用它的点。是否有更高效,更优雅的Swift编写此功能的方式?我很感激任何帮助!
答案 0 :(得分:14)
这并没有回答OP"自动更正"直接问题,但这是代码可能是回答标题中提出的问题的最简单方法:
Swift 3
let myString = "The dog jumped over a fence"
let myStringWithoutLastWord = myString.components(separatedBy: " ").dropLast().joined(separator: " ")
答案 1 :(得分:5)
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循环:
if let word = autocorrectList[arrayOfWords.last] {
fullString = word
hasWordReadyToCorrect = true
}
最终你要做的就是查看输入文本的最后一个单词是否与自动更正列表中的任何键匹配。你可以尝试使用这样的可选绑定直接获取值。
---
如果我想到更多,我会通知您。