2015-09-29 22 views
18

La risposta in How to strip special characters out of string? non funziona.Come rimuovere i caratteri speciali dalla stringa in Swift 2?

Ecco cosa ho ottenuto e mi dà un errore

func removeSpecialCharsFromString(str: String) -> String { 
    let chars: Set<String> = Set(arrayLiteral: "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_") 

    return String(str.characters.filter { chars.contains($0) }) //error here at $0 
} 

L'errore a $ 0 dice _Element (aka Personaggio) non possono essere convertiti in attesa tipo di argomento 'String'.

+1

La linea 'diamo text = str 'è semplicemente sciocco. – matt

+0

Nella tua domanda collegata, l'operazione viene eseguita su 'filter (text)' mentre lo stai facendo su 'text.characters' che è un array, e String non ha inizializzatore usando l'array di caratteri e quindi la tua funzione fallisce. –

risposta

43

Ti piace questa:

func removeSpecialCharsFromString(text: String) -> String { 
    let okayChars : Set<Character> = 
     Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_".characters) 
    return String(text.characters.filter {okayChars.contains($0) }) 
} 

Ed ecco come prova:

let s = removeSpecialCharsFromString("père") // "pre" 
+0

@Kametrixom Agreed; il mio obiettivo era quello di correggere la sintassi dell'OP, non di risolvere il problema in modo ottimale. – matt

+0

@Kametrixom Modificato per utilizzare set anziché array. La ricerca in un set dovrebbe essere molto più efficiente. – matt

+0

@ durul-dalkanat Risposta storica. Swift 2! Se vuoi dare una risposta a Swift 4, dagli; non cambiare il mio. Grazie. – matt

5

In Swift 1.2,

let chars = Set("abcde...") 

creato un insieme che contiene tutti i caratteri dalla stringa data. In Swift 2.0 questo deve essere fatto come

let chars = Set("abcde...".characters) 

Il motivo è che una stringa in se non è più conforme alle SequenceType, è necessario utilizzare la vista characters esplicitamente.

Con questo cambiamento, il metodo compila e funziona come previsto:

func removeSpecialCharsFromString(str: String) -> String { 
    let chars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_".characters) 
    return String(str.characters.filter { chars.contains($0) }) 
} 

let cleaned = removeSpecialCharsFromString("ab€xy") 
print(cleaned) // abxy 

Nota: @Kametrixom suggerito di creare il set solo una volta. Quindi se c'è problema di prestazioni con il metodo di cui sopra è possibile spostare la dichiarazione del set di fuori della funzione, o fare un locale static:

func removeSpecialCharsFromString(str: String) -> String { 
    struct Constants { 
     static let validChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_".characters) 
    } 
    return String(str.characters.filter { Constants.validChars.contains($0) }) 
} 
+2

Suggerisco di spostare la dichiarazione di 'chars' al di fuori della funzione, in quanto può essere creata ogni volta che viene invocata la funzione – Kametrixom

Problemi correlati