2014-10-08 60 views
6

我正在嘗試構建一個自動更正系統,因此我需要能夠刪除鍵入的最後一個單詞並將其替換爲正確的單詞。我的解決方案:從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個字時,我的問題就出現了。每次按下某個字符時,需要一段時間才能填充該數組,並且它開始滯後於無法使用它。有沒有更高效和優雅的Swift寫這個函數的方法?我會很感激任何幫助!

回答

5

1.

一兩件事,迭代是沒有必要的:

for word in words { 
    arrayOfWords += [word] 
} 

你可以這樣做:

arrayOfWords += words 

2.

打破循環將是升防止不必要的迭代:

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 
} 

最終你正在做的是看是否在輸入文本的最後一個字匹配任何的自動更正列表中的鍵。您可以嘗試直接使用可選綁定來獲取值。

---

我會讓你知道,如果我想的更多。

+0

黨!您將我的所有代碼簡化爲3行,並且效果更好!如果您想到更多,我會保持打開頁面,但到目前爲止,在我輸入的一個大段落中,我沒有任何問題。雖然我唯一擔心的是,我檢查的字典只有10字左右,因爲這是在完成列表之前進行的測試。如果單詞列表的時間更長,您認爲這段代碼會保持高效嗎? – SomeGuy 2014-10-08 20:40:40

+1

@SomeGuy - 詞典旨在進行優化,因此查找不應過多地抑制性能。據說,擁有一個非常大的字典和每個關鍵筆畫的處理可能會顯示出一些性能問題。我無法找到任何優秀的快速搜索基準,所以我無法確定地說。 – Logan 2014-10-08 20:50:36

+0

有沒有更有效的方法可以讓你想到製作自動更正系統?我剛剛製作了關鍵值對,例如關鍵的東西是價值,所以如果用戶輸入了關鍵字,它就會變成那裏。 – SomeGuy 2014-10-09 03:03:00

9

這並不直接回答OP的「自動更正」的問題,但這是代碼可能回答的稱號提出的問題的最簡單的方法:

斯威夫特3

let myString = "The dog jumped over a fence" 
let myStringWithoutLastWord = myString.components(separatedBy: " ").dropLast().joined(separator: " ") 
相關問題