Swift2 如何使用Swift 2删除字符串中的多个空格

Swift2 如何使用Swift 2删除字符串中的多个空格,swift2,xcode7,removing-whitespace,Swift2,Xcode7,Removing Whitespace,在Swift 2之前,我使用此扩展来删除多个空格: func condenseWhitespace() -> String { let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).filter({!Swift.isEmpty($0)}) return " ".join(components)

在Swift 2之前,我使用此扩展来删除多个空格:

func condenseWhitespace() -> String {
        let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).filter({!Swift.isEmpty($0)})
        return " ".join(components)
}
但是现在用Swift 2我得到了错误

无法使用类型为“(字符串)”的参数列表调用“isEmpty”

现在如何使用Swift 2删除多个空格?
Thnx

Swift 2中,
join
已成为
joinWithSeparator
,您可以在数组中调用它

filter
中,应对当前迭代项
$0
调用
isEmpty

要将空格和换行符替换为问题中的唯一空格字符,请执行以下操作:

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

SWIFT 3:更干净的版本

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

将字符串拆分为数组,然后再次加入非内存有效的中。它需要很多内存。在这种情况下,最好的方法是扫描给定的字符串并对其执行操作正则表达式是扫描文本的高级方法。对于上述结论,解决方案如下所示:

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)
 var message = "What  is the    purpose   of life?"
 message = message.removeExtraSpaces()
 print(message)
输出:

processedString=>“你好,世界!我在这里!”


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

这里是我的:它的实际工作原理

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: " ")

}
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
    }
} 
用法

let startingString = "hello   world! \n\n I am   here!"
let processedString = startingString.removeExtraSpaces()
print(processedString)
 var message = "What  is the    purpose   of life?"
 message = message.removeExtraSpaces()
 print(message)
输出:

人生的目的是什么


最干净的版本。有文档记录,内存效率高,极易使用

extension String {

    /// Returns a condensed string, with no extra whitespaces and no new lines.
    var condensed: String {
        return replacingOccurrences(of: "[\\s\n]+", with: " ", options: .regularExpression, range: nil)
    }

    /// Returns a condensed string, with no whitespaces at all and no new lines.
    var extraCondensed: String {
        return replacingOccurrences(of: "[\\s\n]+", with: "", options: .regularExpression, range: nil)
    }

}
用法: 输出: a:“你好,我是一根弦”


b:“HelloiamString”

使用var比func有什么好处?我不认为这有什么区别。只需保存()请小心,如果要使其与空格和换行符配合使用,则需要在加入时将新行作为新行管理,而不是“”进行管理。**func condencewhitespace()->字符串{let components=self.components(分隔符:.whitespaces)let tmpstr=components.filter{!$0.isEmpty}.joined(分隔符:“”)let components2=tmpstr.components(分隔符:.newlines)返回components2.filter{!$0.isEmpty}.joined(分隔符:“\n”)}**该扩展在Swift 5中非常有效。救生代码!谢谢:)谢谢!这比创建不必要的数组要好。@JeanNicolas为此,您可以通过将.trimmingCharacters(in:.whitespacesAndNewlines)函数添加到扩展名中来使用它。上述解决方案是将多个空格或换行减少到1个空格。如果你能让这个功能更负责地修剪刺,我会非常感激。谢谢:-)