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) })
}
fonte
2015-09-29 19:05:59
La linea 'diamo text = str 'è semplicemente sciocco. – matt
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. –