¿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"
tounaobun
fuente
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.

Sivanraj M
fuente
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"
Thiago Arreguy
fuente
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" */
Bishow Gurung
fuente
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"
Saranjith
fuente
21

Swift 3

let result = " abc ".trimmingCharacters(in: .whitespacesAndNewlines)
Warif Akhand Rishi
fuente
@LucasFarah ve una rápida evolución
Warif Akhand Rishi
Fecha de lanzamiento prevista: Finales de 2016
Warif Akhand Rishi
1
En realidad son "espacios en blanco y nuevas líneas", jaja, queda uno.
RainCast
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"
Amin Aliari
fuente
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 
ViJay Avhad
fuente
5

Puedes usar el método trim () en una extensión de Swift String que escribí https://bit.ly/JString .

var string = "hello  "
var trimmed = string.trim()
println(trimmed)// "hello"
William Falcon
fuente
se ve bien. Lo usaré
philipp
5

Otra forma similar:

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

Utilizar:

let trimmedString = "myString ".trimmed
usuario23
fuente
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

Esqarrouth
fuente
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)
    }
}
Martin Algesten
fuente
3

// Swift 4.0 Eliminar espacios y nuevas líneas

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: .whitespacesAndNewlines)         
    }
}
Danielvgftv
fuente
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: ","))
Varun Naharia
fuente
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)

Yeis Gallegos
fuente
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)
NonCreature0714
fuente