web-dev-qa-db-fra.com

Comment supprimer des caractères spéciaux de la chaîne dans Swift 2?

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

30
Harout360

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"
55
matt

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"

22
Maksim Kniazev

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()
    }
}
9
Bisca

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) })
}
6
Martin R

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"
2
Leo Dabus