Как удалить несколько пробелов в Строках с помощью 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: " ")

}