如何使用Swift 2删除Strings中的多个空格

问题描述 投票:12回答:5

直到Swift 2我使用此扩展来删除多个空格:

func condenseWhitespace() -> String {
        let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).filter({!Swift.isEmpty($0)})
        return " ".join(components)
}

但是现在我得到了Swift 2错误

无法使用类型'(String)'的参数列表调用'isEmpty'

我现在怎么能用Swift 2删除多个空格?日Thnx!

swift2 xcode7 removing-whitespace
5个回答
36
投票

在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!"

7
投票

SWIFT 3:更清洁的版本

extension String {
    var condensedWhitespace: String {
        let components = self.components(separatedBy: .whitespacesAndNewlines)
        return components.filter { !$0.isEmpty }.joined(separator: " ")
    }
}

6
投票

将字符串拆分为数组,然后再次加入非内存效率。它占用了大量的内存。在这种情况下,最好的方法是扫描给定的字符串并对其执行操作。正则表达式是扫描文本的先进方法。对于上述结论,解决方案如下:

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)

输出:

processedString =>“你好世界!我来了!”

您可以根据自己的要求做更多事情,但我在这里指出的是使用带字符串的正则表达式而不是创建将消耗大量内存的数组。


1
投票

这是我的:它是如何实际运作的。

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)

输出:

生命的目的是什么?


0
投票

var str =“Hello World。

如果让正则表达式=尝试? NSRegularExpression(模式:“\ s +”,选项:NSRegularExpression.Options.case不敏感){

str = regex.stringByReplacingMatches(in:str,options:[],range:NSMakeRange(0,str.count),withTemplate:“”)

}

© www.soinside.com 2019 - 2024. All rights reserved.