Как удалить несколько пробелов в Строках с помощью Swift 2
До Swift 2 я использовал это расширение для удаления нескольких пробелов:
func condenseWhitespace() -> String {
let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).filter({!Swift.isEmpty($0)})
return " ".join(components)
}
но с Swift 2 теперь я получаю ошибку
Невозможно вызвать 'isEmpty' с помощью списка аргументов типа '(String)'
Как мне теперь удалить несколько пробелов с помощью Swift 2?
Thnx!
Ответы
Ответ 1
В Swift 2 join
стало joinWithSeparator
и вы вызываете его в массиве.
В filter
isEmpty
следует вызывать текущий элемент итерации $0
.
Чтобы заменить пробелы и символы новой строки уникальными символами пробела, как в вашем вопросе:
extension String {
func condenseWhitespace() -> String {
let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
return components.filter { !$0.isEmpty }.joinWithSeparator(" ")
}
}
let result = "Hello World.\nHello!".condenseWhitespace() // "Hello World. Hello!"
Поскольку ваша функция не принимает никаких параметров, вы можете сделать это свойство вместо этого:
extension String {
var condensedWhitespace: String {
let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
return components.filter { !$0.isEmpty }.joinWithSeparator(" ")
}
}
let result = "Hello World.\nHello!".condensedWhitespace // "Hello World. Hello!"
В Swift 3 еще больше изменений.
Функция:
extension String {
func condenseWhitespace() -> String {
let components = self.components(separatedBy: NSCharacterSet.whitespacesAndNewlines)
return components.filter { !$0.isEmpty }.joined(separator: " ")
}
}
let result = "Hello World.\nHello!".condenseWhitespace()
Имущество:
extension String {
var condensedWhitespace: String {
let components = self.components(separatedBy: NSCharacterSet.whitespacesAndNewlines)
return components.filter { !$0.isEmpty }.joined(separator: " ")
}
}
let result = "Hello World.\nHello!".condensedWhitespace
В Swift 4.2 NSCharacterSet теперь является CharacterSet, и вы можете опустить и использовать точечный синтаксис:
extension String {
func condenseWhitespace() -> String {
let components = self.components(separatedBy: .whitespacesAndNewlines)
return components.filter { !$0.isEmpty }.joined(separator: " ")
}
}
let result = "Hello World.\nHello!".condenseWhitespace() // "Hello World. Hello!"
Ответ 2
Разбейте строку на массив, а затем снова соедините в неэффективной памяти. Это занимает много памяти. В этом случае лучше всего сканировать заданную строку и выполнять над ней операции. Регулярное выражение - это продвинутый способ сканирования текста. Для приведенного выше вывода решение приведено ниже:
Swift 4.x
extension String {
func removeExtraSpaces() -> String {
return self.replacingOccurrences(of: "[\\s\n]+", with: " ", options: .regularExpression, range: nil)
}
}
Обычаи
let startingString = "hello world! \n\n I am here!"
let processedString = startingString.removeExtraSpaces()
print(processedString)
Выход:
processingString => "Привет, мир! Я здесь!"
Вы можете сделать больше в соответствии со своими требованиями, но здесь я хочу использовать регулярные выражения со строкой, а не создавать массивы, которые будут занимать много памяти.
Ответ 3
SWIFT 3: более чистая версия
extension String {
var condensedWhitespace: String {
let components = self.components(separatedBy: .whitespacesAndNewlines)
return components.filter { !$0.isEmpty }.joined(separator: " ")
}
}
Ответ 4
Вот мое: Как это на самом деле работало.
extension String {
func removeExtraSpaces() -> String {
var data = ""
var numberOfSpace = 0
let items = self.getComponents(separatedBy: " ")
for item in items{
if item == " "{
numberOfSpace = numberOfSpace + 1
}else{
numberOfSpace = 0
}
if numberOfSpace == 1 || numberOfSpace == 0 {
data = data + item
//data.append(item)
}
}
return data
}
}
Обычаи
var message = "What is the purpose of life?"
message = message.removeExtraSpaces()
print(message)
Выход:
Что такое смысл жизни?
Ответ 5
var str = "Hello World.\nHello!"
if let regex = try? NSRegularExpression(pattern: "\\s+", options:NSRegularExpression.Options.caseInsensitive)
{
str = regex.stringByReplacingMatches(in: str, options: [], range: NSMakeRange(0, str.count), withTemplate: " ")
}