Swift a-t-il une méthode de découpage sur String?


393

Swift a-t-il une méthode de découpage sur String? Par exemple:

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

4
@mattdipasquale trim est un nom très courant pour cette opération
Austin

Réponses:


831

Voici comment supprimer tous les espaces blancs du début et de la fin d'un fichier String.

(Exemple testé avec 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"

(Exemple testé avec 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"

J'espère que cela t'aides.


Ne fonctionnera pas sur swif 1.2, car il n'y a pas de convention automatique entre String et NSString.
elcuco

5
Cela fonctionne très bien dans Swift 1.2 - l'objet String a la méthode stringByTrimmingCharactersInSet (ce n'est pas une exclusivité NSString)
Ben Dodson

8
Dans Swift 3.0, c'est: let trimmedString = myString.trimmingCharacters (in: .whitespaces)
kikettas

6
Cela ne signifie pas qu'il est obsolète. Tout le monde n'utilise pas encore Swift 3.0.
c.dunlap

2
Dans Swift 3.0, cela ne supprimera pas les espaces blancs entre les chaînes. Cela supprimera uniquement les espaces blancs de début et de fin. Pour cela, référez-vous à cette réponse: stackoverflow.com/a/39067610/4886069

130

Mettez ce code sur un fichier de votre projet, quelque chose comme Utils.swift:

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

Vous pourrez donc faire ceci:

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

Solution Swift 3.0

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

Vous pourrez donc faire ceci:

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

2
Est-ce sûr? Comment empêcher une collision de nom de méthode si Apple ou une bibliothèque tierce ajoute la même méthode String?
ma11hew28

12
Les extensions sont sûres - et en fait Apple en fait un usage prolifique dans leurs API internes. Vous ne pouvez pas empêcher les collisions de noms, et c'est en fait bien. Vous obtiendrez une erreur de compilation lorsque Apple ajoutera enfin une méthode trim () et vous saurez que votre extension n'est plus requise. Les extensions sont assez élégantes et placent les méthodes là où vous en avez besoin plutôt que certaines classes utilitaires obscures comme StringUtils - le problème que j'ai est lorsqu'une classe n'a pas la méthode dont j'ai besoin parce qu'un autre framework n'a pas été importé qui y a ajouté des extensions.
absmiths

3
Hey, dans Swift 3 devrait être de retourreturn self.trimmingCharacters(in: .whitespacesAndNewlines)

7
laissez result = "Hello World" .trim () // result = "HelloWorld" cela ne supprimera pas les espaces blancs contenus dans la chaîne. ne supprimera que les espaces de début et de fin.
Sahil

2
cela ne supprimera pas les espaces entre les chaînes. Il supprime uniquement les espaces de début et de fin. La meilleure façon de supprimer les espaces entre les chaînes est d'utiliser votre texte? .ReplacingOccurrences (of: "", with: "") au lieu d'utiliser trimmingCharacters
Umesh Sawant

57

Dans Swift 3.0

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

Et vous pouvez appeler

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

4
Que se passe-t-il si je souhaite uniquement supprimer les espaces de fin et de début?
Suragch

1
Je suis nouveau dans Swift 3 extensions. Si une bibliothèque modifie String et que je modifie également String, est-il possible d'obtenir des collisions? Et si les futures versions de swift ad une méthode trim ()? Donc .. en gros .. les extensions sont-elles sûres à utiliser comme ça?
Gattster

1
il est possible d'obtenir des collisions.
Alex Brown

laissez result = "Hello World" .trim () // result = "HelloWorld" cela ne supprimera pas les espaces blancs contenus dans la chaîne. ne supprimera que les espaces de début et de fin
Sahil

45

Swift 5 et 4.2

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


9

Oui, vous pouvez le faire comme ceci:

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

CharacterSet est en fait un outil vraiment puissant pour créer une règle de découpage avec beaucoup plus de flexibilité qu'un ensemble prédéfini comme .whitespacesAndNewlines.

Par exemple:

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

6

Tronquer la chaîne à une longueur spécifique

Si vous avez entré un bloc de phrase / texte et que vous souhaitez enregistrer uniquement la longueur spécifiée hors de ce texte. Ajoutez l'extension suivante à la classe

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

}

Utilisation

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

Vous pouvez utiliser la méthode trim () dans une extension Swift String que j'ai écrite https://bit.ly/JString .

var string = "hello  "
var trimmed = string.trim()
println(trimmed)// "hello"

à l'air cool. Je vais l'utiliser.
philipp

5

Une autre manière similaire:

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

Utilisation:

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

Tiré de ce repo à moi: https://github.com/goktugyil/EZSwiftExtensions/commit/609fce34a41f98733f97dfd7b4c23b5d16416206


J'aime le verbe conforme rapide pour ne pas muter.
Alex Brown

4

Dans Swift3 XCode 8 Final

Notez que CharacterSet.whitespacesn'est plus une fonction!

(Ni l'un ni l'autre NSCharacterSet.whitespaces)

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

3

// Swift 4.0 Supprimer des espaces et de nouvelles lignes

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

2

Vous pouvez également envoyer des caractères que vous souhaitez couper

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

J'ai créé cette fonction qui permet d'entrer une chaîne et retourne une liste de chaîne coupée par n'importe quel caractère

 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

}

as n'a pas trouvé de moyen de le faire dans swift (compile et fonctionne parfaitement dans swift 2.0)


2
pouvez-vous définir ce que vous entendez par «couper», avec un exemple. Puisque votre type de retour est [String], vous ne pouvez pas implémenter ce que l'OP a demandé. (qui renvoie une chaîne)
Alex Brown

0

N'oubliez pas de import Foundationou UIKit.

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

Résultat:

"aaa"

Sinon, vous obtiendrez:

error: value of type 'String' has no member 'trimmingCharacters'
    return self.trimmingCharacters(in: .whitespaces)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.