¿Swift tiene un método de recorte en String?


393

¿Swift tiene un método de recorte en String? Por ejemplo:

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

44
@mattdipasquale trim es un nombre muy común para esta operación
Austin

Respuestas:


831

A continuación se explica cómo eliminar todo el espacio en blanco desde el principio y el final de a String.

(Ejemplo probado con Swift 2.0 .)

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"

(Ejemplo probado con Swift 3+ .)

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"

Espero que esto ayude.


No funcionará en swif 1.2, ya que no hay una convención automática de String a NSString.
elcuco

55
Funciona bien en Swift 1.2: el objeto String tiene el método stringByTrimmingCharactersInSet (no es exclusivo de NSString)
Ben Dodson

8
En Swift 3.0 es: let trimmedString = myString.trimmingCharacters (en: .whitespaces)
kikettas

66
Eso no significa que esté desactualizado. No todos están usando Swift 3.0 todavía.
c.dunlap

2
En Swift 3.0, esto no eliminará los espacios en blanco entre las cadenas. Solo eliminará los espacios en blanco iniciales y finales. Para eso, consulte esta respuesta: stackoverflow.com/a/39067610/4886069

130

Pon este código en un archivo en tu proyecto, algo como Utils.swift:

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

Entonces podrás hacer esto:

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

Solución Swift 3.0

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

Entonces podrás hacer esto:

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

2
¿Eso es seguro? ¿Cómo evito la colisión de un nombre de método si Apple o alguna biblioteca de terceros agrega el mismo método String?
ma11hew28

12
Las extensiones son seguras, y de hecho Apple las utiliza prolíficamente en sus API internas. No puede evitar las colisiones de nombres, y esto es realmente bueno. Obtendrá un error de compilación cuando Apple finalmente agregue un método trim () y sabrá que su extensión ya no es necesaria. Las extensiones son bastante elegantes y ponen métodos donde los necesita en lugar de alguna clase de utilidad oscura como StringUtils: el problema que tengo es cuando una clase no tiene un método que necesito porque no se importó otro marco que le agregó extensiones.
Herreros

3
Hola, en Swift 3 debería ser devueltoreturn self.trimmingCharacters(in: .whitespacesAndNewlines)

77
let result = "Hello World" .trim () // result = "HelloWorld" esto no eliminará los espacios en blanco contenidos en la cadena. eliminará solo los espacios iniciales y finales.
Sahil

2
esto no eliminará espacios entre cadenas. Solo elimina el espacio inicial y final. Entonces, ¿la mejor manera de eliminar espacios entre cadenas es usar su texto? .ReplacingOccurrences (of: "", with: "") en lugar de usar trimmingCharacters
Umesh Sawant

57

En Swift 3.0

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

Y puedes llamar

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

44
¿Qué sucede si solo quiero recortar los espacios en blanco iniciales y finales?
Suragch

1
Soy nuevo en swift 3 extensiones. Si una biblioteca modifica String, y yo también modifico String, ¿es posible obtener colisiones? ¿Qué pasa si las versiones futuras de swift ad un método trim ()? Entonces ... básicamente ... ¿son seguras de usar extensiones como esta?
Gattster

1
Es posible obtener colisiones.
Alex Brown

let result = "Hello World" .trim () // result = "HelloWorld" esto no eliminará los espacios en blanco contenidos en la cadena. eliminará solo los espacios iniciales y finales
Sahil

45

Swift 5 y 4.2

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


9

Sí, puede hacerlo así:

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

CharacterSet es en realidad una herramienta realmente poderosa para crear una regla de recorte con mucha más flexibilidad que un conjunto predefinido como .whitespacesAndNewlines.

Por ejemplo:

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

6

Truncar cadena a longitud específica

Si ha ingresado un bloque de oración / texto y desea guardar solo la longitud especificada fuera del texto. Agregue la siguiente extensión a la clase

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)
   }

}

Utilizar

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

Otra forma similar:

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

Utilizar:

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())
    }
}

Tomado de este repositorio mío: https://github.com/goktugyil/EZSwiftExtensions/commit/609fce34a41f98733f97dfd7b4c23b5d16416206


Me gusta el verbo que cumple rápidamente para no mutar.
Alex Brown

4

En Swift3 XCode 8 Final

¡Observe que CharacterSet.whitespacesya no es una función!

(Ninguno lo es NSCharacterSet.whitespaces)

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

3

// Swift 4.0 Eliminar espacios y nuevas líneas

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

2

También puede enviar los caracteres que desea que se recorte

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

Creé esta función que permite ingresar una cadena y devuelve una lista de cadenas recortadas por cualquier carácter

 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

}

ya que no encontró una manera de hacer esto en swift (compila y funciona perfectamente en swift 2.0)


2
¿Puedes definir qué quieres decir con 'recortar', con un ejemplo? Como su tipo de retorno es [Cadena], no puede implementar lo que solicitó el OP. (que devuelve una cadena)
Alex Brown

0

No te olvides de import Foundationo UIKit.

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

Resultado:

"aaa"

De lo contrario, obtendrá:

error: value of type 'String' has no member 'trimmingCharacters'
    return self.trimmingCharacters(in: .whitespaces)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.