Как удалить специальные символы из строки в Swift 2?

Ответ в Как удалить специальные символы из строки? не работает.

Вот что я получил, и это дает мне ошибку

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
}

Ошибка в $0 говорит, что элемент _Element (aka Character) не может быть преобразован в ожидаемый тип аргумента "String".

Ответы

Ответ 1

Вот так:

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

И вот как проверить:

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

Ответ 2

В Swift 1.2,

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

создал набор, содержащий все символы из данной строки. В Swift 2.0 это должно выполняться как

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

Причина в том, что сама строка больше не соответствует SequenceType, вы должны явно использовать представление characters.

С этим изменением ваш метод компилируется и работает как ожидалось:

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

Примечание: @Kametrixom предложил создать набор только один раз. Поэтому, если есть производительности с помощью вышеуказанного метода вы можете либо переместить объявление набора вне функции или сделать его local static:

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