Som*_*Guy 6 swift ios8 swift-extensions ios8-extension
我正在尝试构建一个自动更正系统,所以我需要能够删除键入的最后一个单词并用正确的单词替换它.我的解决方案
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)")
}
}
Run Code Online (Sandbox Code Playgroud)
在每次击键后调用此方法,如果按下该空格,则会更正该单词.当文本字符串变得超过大约20个单词时,我的问题就出现了.每次按下一个字符时,它需要一段时间来填充数组,并且它开始滞后到无法使用它的点.是否有更高效,更优雅的Swift编写此功能的方式?我很感激任何帮助!
Tra*_* M. 15
这不能直接回答OP的"自动更正"问题,但这是代码可能是回答标题中提出的问题的最简单方法:
斯威夫特3
let myString = "The dog jumped over a fence"
let myStringWithoutLastWord = myString.components(separatedBy: " ").dropLast().joined(separator: " ")
Run Code Online (Sandbox Code Playgroud)
1.
有一点,迭代不是必需的:
for word in words {
arrayOfWords += [word]
}
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
arrayOfWords += words
Run Code Online (Sandbox Code Playgroud)
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'
}
}
Run Code Online (Sandbox Code Playgroud)
或者甚至更好,完全忘记for循环:
if let word = autocorrectList[arrayOfWords.last] {
fullString = word
hasWordReadyToCorrect = true
}
Run Code Online (Sandbox Code Playgroud)
最终你要做的是查看输入文本的最后一个单词是否与自动更正列表中的任何键匹配.您可以尝试使用这样的可选绑定直接获取值.
---
如果我想到更多,我会告诉你的.