La réponse dans Comment retirer les caractères spéciaux de la chaîne? ne fonctionne pas.
Voici ce que j'ai et ça me donne une erreur
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'erreur à $ 0 indique que _Element (aka Caractère) ne peut pas être converti en type d'argument attendu 'String'.
Comme ça:
func removeSpecialCharsFromString(text: String) -> String {
let okayChars : Set<Character> =
Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_".characters)
return String(text.characters.filter {okayChars.contains($0) })
}
Et voici comment tester:
let s = removeSpecialCharsFromString("père") // "pre"
Swift 4:
func removeSpecialCharsFromString(text: String) -> String {
let okayChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-=().!_")
return text.filter {okayChars.contains($0) }
}
Manière plus propre:
extension String {
var stripped: String {
let okayChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-=().!_")
return self.filter {okayChars.contains($0) }
}
}
Utilisez cette extension comme:
let myCleanString = "some.Text@#$".stripped
Sortie: "some.Text"
Je pense qu'une solution plus propre pourrait être cette approche:
extension String {
var alphanumeric: String {
return self.components(separatedBy: CharacterSet.alphanumerics.inverted).joined().lowercased()
}
}
Dans Swift 1.2,
let chars = Set("abcde...")
créé un ensemble contenant tous les caractères de la chaîne donnée. Dans Swift 2. cela doit être fait comme
let chars = Set("abcde...".characters)
La raison en est qu'une chaîne elle-même n'est plus conforme à SequenceType
, vous devez utiliser explicitement la vue characters
.
Avec ce changement, votre méthode se compile et fonctionne comme prévu:
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
Remarque: @Kametrixom a suggéré de créer l'ensemble une seule fois. Donc si il y a un problème de performance avec la méthode ci-dessus, vous pouvez soit déplacer la déclaration de l'ensemble en dehors de la fonction, soit en faire un static
:
func removeSpecialCharsFromString(str: String) -> String {
struct Constants {
static let validChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_".characters)
}
return String(str.characters.filter { Constants.validChars.contains($0) })
}
Si vous devez conserver uniquement des caractères imprimables ascii dans une chaîne, vous pouvez simplement les filtrer en vérifiant si leurs valeurs unicodeScalar sont ascii:
extension Character {
var isAscii: Bool {
return unicodeScalars.allSatisfy { $0.isASCII }
}
}
extension RangeReplaceableCollection where Self: StringProtocol {
var asciiPrintable: Self {
return filter { $0.isAscii }
}
}
let string = "cafe\u{301}"
let asciiPrintable = string.asciiPrintable
print(asciiPrintable) // "caf"