2014-10-08 59 views
6

Sto provando a creare un sistema di correzione automatica, quindi devo essere in grado di eliminare l'ultima parola digitata e sostituirla con quella corretta. La mia soluzione:Rimuovere in modo efficiente l'ultima parola da una stringa in Swift

Questo metodo viene chiamato dopo ogni sequenza di tasti, e se lo spazio viene premuto, corregge la parola. Il mio problema arriva quando la stringa di testo diventa più lunga di circa 20 parole. Ci vuole un po 'perché riempia l'array ogni volta che viene premuto un carattere, e inizia a non essere in grado di usarlo. C'è un modo più efficiente ed elegante di scrivere questa funzione in Swift? Apprezzerei qualsiasi aiuto!

risposta

5

1.

Una cosa, di iterazione non è necessario per questo:

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

Si può semplicemente fare:

arrayOfWords += words 

2.

Rompere il ciclo for wil l impedice l'iterazione inutilmente:

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' 
    } 
} 

O, meglio ancora, dimenticare il ciclo for completamente:

if let word = autocorrectList[arrayOfWords.last] { 
    fullString = word 
    hasWordReadyToCorrect = true 
} 

In definitiva quello che stai facendo è vedere se l'ultima parola del testo immesso corrisponde a qualsiasi dei chiavi nell'elenco di correzione automatica. Puoi semplicemente provare ad ottenere il valore direttamente usando l'associazione opzionale come questa.

---

io farò sapere se penso di più.

+0

Dang ! Hai semplificato tutto il mio codice in 3 righe, e funziona molto meglio! Terrò aperta la pagina nel caso in cui tu pensi di più, ma per ora non ho problemi con lag in un grande paragrafo che ho digitato. L'unica cosa di cui sono preoccupato è che il mio dizionario da cui viene controllato è lungo solo 10 parole perché è stato un test prima di creare l'elenco completo. Pensi che questo codice rimarrà efficiente quando l'elenco delle parole diventa molto più lungo? – SomeGuy

+1

@SomeGuy - I dizionari sono progettati per essere ottimizzati, quindi la ricerca non dovrebbe inibire troppo le prestazioni. Detto questo, avere un dizionario estremamente grande e l'elaborazione con ogni colpo di chiave potrebbe mostrare un impatto sulle prestazioni. Non riesco a trovare alcun buon punto di riferimento rapido dalla ricerca in giro, quindi non posso davvero dire con certezza. – Logan

+0

Esiste un modo più efficiente di pensare a creare un sistema di correzione automatica? Ho appena creato coppie di valori chiave per cose come la chiave che è la chiave e che esiste il valore, quindi se l'utente digita te, si modifica lì. – SomeGuy

9

Questo non risponde problema "Correzione automatica" del PO direttamente, ma questo è il codice è probabilmente il modo più semplice per rispondere alla domanda posta nel titolo:

Swift 3

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