如何在Swift中删除字符串中的空格?

时间:2015-02-16 19:28:02

标签: string swift whitespace

这有效

let replaced = String(map(aString.generate()) {
    $0 == " " ? "-" : $0 })

这不是

let replaced = String(map(aString.generate()) {
    $0 == " " ? "" : $0 })

为什么?

10 个答案:

答案 0 :(得分:11)

枚举一个字符串会给出一系列字符,所以$0在里面 闭包的类型为Character。这个编译

{ $0 == " " ? "-" : $0 }

因为此上下文中的"-"被解释为字符文字 因此与$0的类型相同。但是

{ $0 == " " ? "" : $0 }

无法编译,因为"" 是字符文字(并且在条件表达式a ? b : c中操作数bc 必须具有相同的类型。)

您可以通过将$0转换为字符串来解决此问题:

{ $0 == " " ? "" : String($0) }

但现在映射会返回一个字符串数组 一组字符。所以与其 您必须加入结果的String()构造函数:

let replaced = "".join(map(aString) { $0 == " " ? "" : String($0) })
// Swift 2 / Xcode 7:
let replaced = "".join(aString.characters.map({ $0 == " " ? "" : String($0) }))

(请注意,不需要明确调用generate()。)

当然,

也可以达到同样的效果
let replaced = aString.stringByReplacingOccurrencesOfString(" ", withString: "")

答案 1 :(得分:5)

如果你想从字符串中删除空格,那么只需用stringByReplacingOccurrencesOfString函数传递字符串,如下所示,

let replacedString = string.stringByReplacingOccurrencesOfString(" ", withString: "")

对于文本字段,您可以直接应用UITextField的对象,

let replacedString = textField.text!.stringByReplacingOccurrencesOfString(" ", withString: "")

答案 2 :(得分:5)

这应该适用于Swift 2.2:

let replaced = String(aString.characters.filter {$0 != " "})

答案 3 :(得分:3)

您正在映射,因此应保留元素的数量。在第二种情况下,您删除元素。即使您将" "替换为--,您的示例也会失败。

您可能更喜欢使用filter

let replaced = String(filter(aString.generate()) { $0 != " "})

答案 4 :(得分:3)

如果要删除字符串前后的空格,这在用户输入表单中非常有用,可以使用:

let replaced = aString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

您也可以直接在文本字段中应用它。

答案 5 :(得分:3)

如果你想删除String中任何地方的所有空格,我确实为 Swift 3.0 提出了这个解决方案:

let number = "+000 000 000"
let nonWhiteCharacters = number.unicodeScalars.filter {
    false == NSCharacterSet.whitespacesAndNewlines.contains($0)
}.map(Character.init)
let whitespacelessNumber = String(nonWhiteCharacters)

甚至更好(您需要在序列上使用通用扩展名):

extension Sequence {
    public func reduce<Result>(_ result: (Self) throws -> Result) rethrows -> Result {
        return try result(self)
    }
}

然后你可以写:

let whitespacelessNumber = number.unicodeScalars.filter {
    false == NSCharacterSet.whitespacesAndNewlines.contains($0)
}.map(Character.init).reduce { String($0) }

您还可以将NSCharacterSet.whitespacesAndNewlines替换为任何其他字符集:

NSCharacterSet.controlCharacters
NSCharacterSet.whitespaces
NSCharacterSet.whitespacesAndNewlines
NSCharacterSet.decimalDigits
NSCharacterSet.letters
NSCharacterSet.lowercaseLetters
NSCharacterSet.uppercaseLetters
NSCharacterSet.nonBaseCharacters
NSCharacterSet.alphanumerics
NSCharacterSet.decomposables
NSCharacterSet.illegalCharacters
NSCharacterSet.punctuationCharacters
NSCharacterSet.capitalizedLetters
NSCharacterSet.symbols
NSCharacterSet.newline

答案 6 :(得分:2)

试试这个:

let strArray0 = strArray1.map { $0.stringByTrimmingCharactersInSet(.whitespaceAndNewlineCharacterSet()) }

希望这有帮助

答案 7 :(得分:1)

在Swift 3.0 DO中作为

func RemoveWhiteSpace(aString:String) -> String
    {
        let replaced = aString.trimmingCharacters(in: NSCharacterSet.whitespaces)
        return replaced
    }

并像这样使用

let nonWhiteSpaceStr = self.RemoveWhiteSpace(aString: "I have white Space        ")

答案 8 :(得分:0)

之前的答案中没有一个对我足够迅速,因此我最终使用了Swift 5:

let nonWhitespaceString = String(whitespaceString.compactMap({ $0.isWhitespace ? nil : $0 })

答案 9 :(得分:0)

对于 Swift 5

" spaces here ".replacingOccurrences(of: " ", with: "")

返回:

"spaceshere"