Как удалить специальные символы из строки в 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) })
}