Hat Swift eine Trimmmethode für String?


393

Hat Swift eine Trimmmethode für String? Zum Beispiel:

let result = " abc ".trim()
// result == "abc"

4
@ Mattdipasquale Trim ist ein sehr gebräuchlicher Name für diese Operation
Austin

Antworten:


831

So entfernen Sie alle Leerzeichen vom Anfang und Ende eines String.

(Beispiel mit Swift 2.0 getestet .)

let myString = "  \t\t  Let's trim all the whitespace  \n \t  \n  "
let trimmedString = myString.stringByTrimmingCharactersInSet(
    NSCharacterSet.whitespaceAndNewlineCharacterSet()
)
// Returns "Let's trim all the whitespace"

(Beispiel mit Swift 3+ getestet .)

let myString = "  \t\t  Let's trim all the whitespace  \n \t  \n  "
let trimmedString = myString.trimmingCharacters(in: .whitespacesAndNewlines)
// Returns "Let's trim all the whitespace"

Hoffe das hilft.


Funktioniert nicht mit swif 1.2, da es keine automatische Konvention von String zu NSString gibt.
Elcuco

5
Es funktioniert gut in Swift 1.2 - das String-Objekt hat die stringByTrimmingCharactersInSet-Methode (es ist keine exklusive NSString-Methode)
Ben Dodson

8
In Swift 3.0 ist: let trimmedString = myString.trimmingCharacters (in: .whitespaces)
kikettas

6
Das heißt nicht, dass es veraltet ist. Noch verwenden nicht alle Swift 3.0.
c.dunlap

2
In Swift 3.0 werden dadurch keine Leerzeichen zwischen den Zeichenfolgen entfernt. Es werden nur führende und nachfolgende Leerzeichen entfernt. Siehe

130

Fügen Sie diesen Code in eine Datei in Ihrem Projekt ein. So etwas wie Utils.swift:

extension String
{   
    func trim() -> String
    {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
    }
}

So können Sie Folgendes tun:

let result = " abc ".trim()
// result == "abc"

Swift 3.0-Lösung

extension String
{   
    func trim() -> String
   {
    return self.trimmingCharacters(in: NSCharacterSet.whitespaces)
   }
}

So können Sie Folgendes tun:

let result = " Hello World ".trim()
// result = "HelloWorld"

2
Ist das sicher Wie verhindere ich eine Kollision mit Methodennamen, wenn Apple oder eine Bibliothek eines Drittanbieters dieselbe Methode hinzufügt String?
ma11hew28

12
Erweiterungen sind sicher - und tatsächlich nutzt Apple sie in seinen internen APIs. Sie können keine Namenskollisionen verhindern, und das ist in der Tat gut. Sie erhalten einen Kompilierungsfehler, wenn Apple endlich eine trim () -Methode hinzufügt und Sie wissen, dass Ihre Erweiterung nicht mehr benötigt wird. Erweiterungen sind recht elegant und platzieren Methoden dort, wo Sie sie benötigen, anstatt in einer obskuren Dienstprogrammklasse wie StringUtils. Das Problem besteht darin, dass eine Klasse keine Methode hat, die ich benötige, weil kein anderes Framework importiert wurde, das Erweiterungen hinzugefügt hat.
Absmiths

3
Hey, in Swift 3 sollte zurückkehrenreturn self.trimmingCharacters(in: .whitespacesAndNewlines)

7
let result = "Hello World" .trim () // result = "HelloWorld" Dadurch werden die in der Zeichenfolge enthaltenen Leerzeichen nicht entfernt. entfernt nur führende und nachfolgende Leerzeichen.
Sahil

2
Dadurch werden keine Leerzeichen zwischen den Zeichenfolgen entfernt. Es werden nur führende und nachfolgende Leerzeichen entfernt. Der bessere Weg, um Leerzeichen zwischen Zeichenfolgen zu entfernen, ist die Verwendung Ihres Textes? .ReplacingOccurrences (von: "", mit: "") anstelle von trimmingCharacters
Umesh Sawant

57

In Swift 3.0

extension String
{   
    func trim() -> String
   {
    return self.trimmingCharacters(in: CharacterSet.whitespaces)
   }
}

Und du kannst anrufen

let result = " Hello World ".trim()  /* result = "Hello World" */

4
Was ist, wenn ich nur nachgestellte und führende Leerzeichen kürzen möchte?
Suragch

1
Ich bin neu in Swift 3 Erweiterungen. Wenn eine Bibliothek String ändert und ich auch String ändere, können Kollisionen auftreten? Was ist, wenn zukünftige Versionen von swift ad a trim ()? Also ... im Grunde ... sind Erweiterungen so sicher zu verwenden?
Gattster

1
Es ist möglich, Kollisionen zu bekommen.
Alex Brown

let result = "Hello World" .trim () // result = "HelloWorld" Dadurch werden die in der Zeichenfolge enthaltenen Leerzeichen nicht entfernt. wird nur führende und nachfolgende Leerzeichen entfernen
Sahil

45

Swift 5 & 4.2

let trimmedString = " abc ".trimmingCharacters(in: .whitespaces)
 //trimmedString == "abc"


9

Ja, das kannst du so machen:

var str = "  this is the answer   "
str = str.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
print(srt) // "this is the answer"

CharacterSet ist tatsächlich ein sehr leistungsfähiges Tool zum Erstellen einer Trimmregel mit viel mehr Flexibilität als ein vordefinierter Satz wie .whitespacesAndNewlines.

Zum Beispiel:

var str = " Hello World !"
let cs = CharacterSet.init(charactersIn: " !")
str = str.trimmingCharacters(in: cs)
print(str) // "Hello World"

6

Zeichenfolge auf bestimmte Länge kürzen

Wenn Sie einen Satz- / Textblock eingegeben haben und nur die angegebene Länge des Textes speichern möchten. Fügen Sie der Klasse die folgende Erweiterung hinzu

extension String {

   func trunc(_ length: Int) -> String {
    if self.characters.count > length {
        return self.substring(to: self.characters.index(self.startIndex, offsetBy: length))
    } else {
        return self
    }
  }

  func trim() -> String{
     return self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
   }

}

Verwenden

var str = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."
//str is length 74
print(str)
//O/P:  Lorem Ipsum is simply dummy text of the printing and typesetting industry.

str = str.trunc(40)
print(str)
//O/P: Lorem Ipsum is simply dummy text of the 


5

Ein anderer ähnlicher Weg:

extension String {
    var trimmed:String {
        return self.trimmingCharacters(in: CharacterSet.whitespaces)
    }
}

Verwenden:

let trimmedString = "myString ".trimmed

4
extension String {
    /// EZSE: Trims white space and new line characters
    public mutating func trim() {
         self = self.trimmed()
    }

    /// EZSE: Trims white space and new line characters, returns a new string
    public func trimmed() -> String {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    }
}

Entnommen aus meinem Repo: https://github.com/goktugyil/EZSwiftExtensions/commit/609fce34a41f98733f97dfd7b4c23b5d16416206


Ich mag das schnelle konforme Verbing für nicht mutieren.
Alex Brown

4

In Swift3 XCode 8 Final

Beachten Sie, dass das CharacterSet.whitespaceskeine Funktion mehr ist!

(Weder ist NSCharacterSet.whitespaces)

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: CharacterSet.whitespaces)
    }
}

3

// Swift 4.0 Leerzeichen und neue Zeilen entfernen

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: .whitespacesAndNewlines)         
    }
}

2

Sie können auch Zeichen senden, die gekürzt werden sollen

extension String {


    func trim() -> String {

        return self.trimmingCharacters(in: .whitespacesAndNewlines)

    }

    func trim(characterSet:CharacterSet) -> String {

        return self.trimmingCharacters(in: characterSet)

    }
}

validationMessage = validationMessage.trim(characterSet: CharacterSet(charactersIn: ","))

0

Ich habe diese Funktion erstellt, die die Eingabe einer Zeichenfolge ermöglicht und eine Liste von Zeichenfolgen zurückgibt, die von einem beliebigen Zeichen abgeschnitten werden

 func Trim(input:String, character:Character)-> [String]
{
    var collection:[String] = [String]()
    var index  = 0
    var copy = input
    let iterable = input
    var trim = input.startIndex.advancedBy(index)

    for i in iterable.characters

    {
        if (i == character)
        {

            trim = input.startIndex.advancedBy(index)
            // apennding to the list
            collection.append(copy.substringToIndex(trim))

            //cut the input
            index += 1
            trim = input.startIndex.advancedBy(index)
            copy = copy.substringFromIndex(trim)

            index = 0
        }
        else
        {
            index += 1
        }
    }
    collection.append(copy)
    return collection

}

da ich keinen Weg gefunden habe, dies in Swift zu tun (kompiliert und funktioniert perfekt in Swift 2.0)


2
Können Sie anhand eines Beispiels definieren, was Sie unter "Trimmen" verstehen? Da Ihr Rückgabetyp [String] ist, können Sie nicht implementieren, was das OP angefordert hat. (was einen String zurückgibt)
Alex Brown

0

Vergiss nicht import Foundationoder UIKit.

import Foundation
let trimmedString = "   aaa  "".trimmingCharacters(in: .whitespaces)
print(trimmedString)

Ergebnis:

"aaa"

Andernfalls erhalten Sie:

error: value of type 'String' has no member 'trimmingCharacters'
    return self.trimmingCharacters(in: .whitespaces)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.